BEA公司的中间件weblogic工具提供了一套数据库连接的机制,我采用的是weblogic8.1,数据库是Oracle9i客户端,通过 weblogic控制台,我配置了JDBC Connection Pool,并且试图通过java代码去获取一个数据库连接,在今天的研究中碰到了一些问题,谨以此记载,供自己日后参考和与同行共享。
1,通过weblogic配置一个数据库连接池JDBC Connection Pool。
start server之后,可以用IE进入weblogic console,mydomain->service->JDBC->Connection Pool节点顺序可以配置一个或者多个数据库连接池,所有操作都是可视化的操作,界面简单,具体的流程就不详细描述,配置好之后可以在相应域文件夹的config.xml文件中找到对应的JDBCConnectionPool节点,如下:
//-------------config.xml ----------------------------------------------------------------------------------
<JDBCConnectionPool DriverName="oracle.jdbc.OracleDriver"
InitSQL="SQL SELECT * FROM DSP_SRVC_INFO" Name="testJDBC"
PasswordEncrypted="{3DES}9olMbzOwdzQ=" Properties="user=tester"
Targets="myserver" TestConnectionsOnReserve="true"
TestFrequencySeconds="2" TestTableName="test_db" URL="jdbc:oracle:thin:@10.8.8.88:1521:testdb"/>
//-----------------------------------------------------------------------------------------------------------
2,在java代码中调用获取数据库连接。
在1中配置好JDBC Connection Pool之后,直接在console中测试,如果测试通过的话就可以在你的java代码中获取数据库连接了。主要涉及到两个对象:Properties和Driver。
//-------------------------jdbcTest.java--------------------------------------------------------------------
Properties props =new Properties();
props.setProperty("user", "testman");
props.setProperty("password", "testpwd");
Driver myDriver = (Driver) Class.forName("weblogic.jdbc.pool.Driver").newInstance();
connTest = myDriver.connect("jdbc:weblogic:pool:testJDBC", props);
//------------------------------------------------------------------------------------------------------------
我的一个同事通过上述方法可以拿到数据库连接并用该连接获取数据,但是在我的开发过程中JBUILDER总是抛出SQLException异常,提示FailedLoginException: [Security:090304]Authentication Failed:User testman 。我想问下为什么在控制台测试能通过,而调用的时候用户鉴权失败而导致获取连接失败呢?这个问题有待于进一步研究。
3,配置DATA SOURCES获取数据库连接。
通过2获取数据库连接失败之后,我通过weblogic增加了Data Sources,通过mydomain->service->JDBC->Data Sources节点顺序即可。在config.xml中的对应的节点是JDBCTxDataSource:
/-----------------------------------------------------------------------------------------------
<JDBCTxDataSource JNDIName="testJNDI" Name="testDataSrc"
PoolName="testJDBC" Targets="myserver"/>
/-----------------------------------------------------------------------------------------------
用这种方法来获取数据库连接的话,java代码自然不一样了。基本的方法采用下面的代码:
java.sql.Connection connTest = null;
Context initCtx = null;
DataSource datasource = null;
initCtx = new InitialContext();
datasource = (DataSource) initCtx.lookup("testJNDI");//你配的数据源的名字
connTest = datasource.getConnection(); //获得连接。
需要注意的地方就是lookup的参数不是Name属性而是JNDIName属性。到这里数据连接已经获取成功,可以使用这个数据库连接获取数据库的数据了。
/------------------------------------------------------------------------------------------------------------
System.out.println( "dplat_id/t prod_id/t serv_name/t short_name/t region_code/t fee_service_id");
Statement stm = connTest.createStatement();
ResultSet res = stm.executeQuery("select * from dsp_srvc_info where dplat_id=100062");
while(res.next()){
System.out.println(res.getInt("dplat_id") + "/t" +
res.getInt("prod_id") + "/t" +
res.getString("serv_name") + "/t" +
res.getString("short_name") + "/t" +
res.getString("region_code") + "/t" +
res.getInt("fee_service_id"));
}
res.close();
stm.close();
connTest.close();
/--------------------------------------------------------------------------------------------------------------
4,尚未解决的问题:
1)在WEBLOGIC控制台配置Connection Pool的时候需要配置用户名和密码,而在JAVA代码获取数据库连接的时候Properties对象中也需要设置用户名和密码两个属性,不知道这两个地方的用户名和密码是否都是数据库访问的用户名和密码?如果有区别,具体不同在哪里?(如果采用DATA SOURCES连接的话,Properties对象就不需要了)
2)速度的比较:我作了一个测试程序,对比通过WEBLOGIC数据库连接池从数据库取数据和通过直接JAVA代码实现JDBC连接从数据库取数据的两者的速度,发现前者并不存在速度上的优势,相反,后者的速度反而快一些,不知道是否对大型的数据库和频繁的数据库操作是否不一样?weblogic的 JDBC数据库连接池的优势会体现在哪些方面?