WebLogic JDBCTransaction版精华帖整理.docx
- 文档编号:23393289
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:34
- 大小:150.15KB
WebLogic JDBCTransaction版精华帖整理.docx
《WebLogic JDBCTransaction版精华帖整理.docx》由会员分享,可在线阅读,更多相关《WebLogic JDBCTransaction版精华帖整理.docx(34页珍藏版)》请在冰豆网上搜索。
WebLogicJDBCTransaction版精华帖整理
1JDBC连接池配置1.1配置连接池FORWEBLOGIC8.1
论坛内经常有人询问如何配置连接池的问题,这里把配置的详细过程都再重复一遍,并包含论坛内对配置连接池出现的问题回答进行整理。
STEP1:
数据库类型和驱动类型的选择,对于各种TYPE的驱动附录内容会做介绍。
STEP2:
连接池连接属性配置,连接URL,用户名/密码,数据库服务名。
STEP3:
测试连接池配置是否正确。
STEP4:
测试成功后进行部署。
STEP5:
部署成功,选择该连接进行连接池的参数配置。
STEP6:
连接池的参数配置。
配置完成后在config.xml 文件中对应的各属性解释如下:
∙InitialCapacity:
创建连接池时所创建的数据库连接的数目。
∙MaximumCapacity:
连接池中连接的最大数目。
∙CapacityIncrement:
连接池容量在最大容量限制范围内的增量。
∙LoginDelay:
在创建每个物理数据库连接之前要延迟的秒数。
∙AllowShrinking:
将该项设置为true时,如果没有使用额外的连接,则允许连接池把容量减小到InitialCapacity。
∙ShrinkFrequency:
在减小连接池容量之前要等待的秒数。
如果将ShrinkFrequency设置为true,那么也必须将AllowShrinking设置为true。
∙TestFrequency:
数据库连接测试之间间隔的秒数。
在每个RefreshPeriod时间间隔之后,如果设置了TestTableName,就会使用TestTableName测试未使用的数据库连接。
∙TestReservedConnections:
如果选择了这个选项,服务器会在把连接提供给客户端之前对其进行测试。
∙TestCreatedConnections:
如果选择了这个选项,就会在创建一个JDBC连接之后和在把它添加到JDBC连接池中的可用连接列表之前,对该JDBC连接进行测试。
∙TestReleasedConnections:
如果选择了这个选项,服务器就会在把连接返回给连接池之前对其进行测试。
∙TestTableName:
用于JDBC连接测试的数据库表名。
如果指定了TestFrequency,并且选择了TestReservedConnections、TestCreatedConnections或TestReleasedConnections,则TableName是必需的。
∙Weblogic.codeset=GBK:
编码格式
1.1.1通过程序配置连接池
配置连接池可以通过weblogic.management.configuration.JDBCConnectionPoolMBean或者是weblogic.management.configuration.JDBCDataSourceMBeanl编程进行。
具体代码见附录部分—代码1(连接池设置)
1.1.2通过程序查看连接池运行状态信息
配置连接池可以通过weblogic.management.configuration.JDBCConnectionPoolMBean或者编程获取运行态的信息。
具体代码见附录部分—代码2(连接池监控)
1.2配置连接池常见问题1.2.1连接有效性测试选项
Q:
连接池配好后,启动正常,如果ConnectionPool在使用过程中与数据库的联系因为网络的问题或别的原因断掉,是不是必须重新启动weblogic才能重新让ConnectionPool连上数据库?
我现在每次一碰到数据库连不上就要重启一次wlsServer,烦得要命。
此类问题出现的原因:
∙应用服务器到数据库端的网络连接不可靠;
∙数据库在系统运行的情况下重启动;
∙驱动程序的问题造成连接不可用。
A:
WLS里设置连接的检查,一个是获取连接的时候检查该连接是否有效,另外一个就是释放连接的时候检查。
这两个检查在配置连接池的时候都是可以设置的。
设置的参数说明:
参数名称
参数说明
参数选择值
TestConnectionsOnReserve
从连接池获取连接后是否进行有效性测试
True/false
RefreshMinutesparameter
设定connectionpool的刷新时间
刷新的时间间隔
TestTableName
测试的表名,也可以指定SQL
表名或者是SQL
1.2.2不同类型驱动的区别与选择
Q:
请教console中连接池的oracle驱动程序那个多,用哪个好呢?
他们的驱动程序文件分别对应LIB目录下的哪个文件?
A:
BEA_HOME$/weblogic81/server/lib目录内,如果需要连接不同的数据库需要把对应的驱动程序置于该目录内。
JDBC驱动的类型与选择,在配置连接池的时候进行选择。
JDBC-1图JDBC-2图
【TYPE1:
JDBC-ODBC桥】
JDBC-1图左边的分支称为TYPE1,即通常由Sun公司提供的JDBC-ODBC桥接器。
它提供了经由一种或多种ODBC驱动进行访问的JDBC接口,而ODBC驱动,在很多情况下也即数据库的客户端,必须加载到客户机。
因而,它适用于下载和自动安装Java程序不重要、实验用途或者没有其它JDBC驱动可用的情况下。
执行效率比较低,对于那些大数据量存取的应用是不适合的.而且,这种方法要求客户端必须安装ODBC 驱动,所以对于基于 internet ,intranet的应用也是不合适的.因为,不可能要求所有客户都能找到ODBC DRIVER。
【TYPE2:
本地API驱动】
JDBC-1图右边的分支成为模式2,类似于JDBC-ODBC桥接器,需要加载到客户机,却是一个部分用Java实现的驱动接口。
它将JDBC调用转换为对数据库(Oracle、Sybase、Informix、DB2等)客户端接口的调用。
这种驱动比起TYPE1执行效率大大提高了,但它仍然需要在客户端加载数据库厂商提供的代码库。
这样就不适合基于internet的应用。
【TYPE3:
网络协议驱动】
JDBC-2图右边的分支称为TYPE3,它同样是一个纯Java驱动,不同于TYPE4的是基于网络协议。
它的机制是将JDBC调用转换为中间网络协议,然后转换为DBMS协议。
中间网络协议层起到一个读取数据库的中间件的作用,能够连接许多类型的数据库,因而是最灵活的JDBC模式。
这种模式的产品比较适用于企业内部互联网,如若支持国际互联网,还需添加对安全、穿过防火墙访问等的支持。
【TYPE4:
本地协议驱动】
图2左边的分支称为TYPE4,它一般是数据库厂商才能实现的纯Java的基于本地协议的驱动,直接调用DBMS(数据库管理系统)使用的网络协议,对于企业内部互联网来说,是一个实用的解决方案。
1.2.3JDBC连SQLSERVER数据库的常见问题
使用TYPE4类驱动程序,目前支持两种版本的SQLSERVER
WebLogicjDriverforMicrosoftSQLServerVersion7.0and2000,这个版本的驱动是WEBLOGIC的默认设置,不需要做其他的配置。
∙支持SQLServer7.0和2000.
∙支持新的数据类型SQLServerVersion7.0and2000.
WebLogicjDriverforMicrosoftSQLServerVersions6.5and7.0,使用这个版本的驱动,必须在CLASSPATH路径里增加ssqlserver4v65.jar。
∙支持SQLServer6.5.
∙支持SQLServer7.0但有以下两个限制:
一,是否按照6.5的语义规则createscolumnsthatdonotallownullvalues.(ThisbehaviorisnormalforSQLServerversion6.5.)。
二,不支持新的SQLServer7.0数据类型。
知道了以上两点后,有些问题就能很明确了。
Q:
ClassNotFoundException的错误。
该错误主要是没有加载SQLSERVER的驱动程序。
A:
JDBC连接SQLSERVER需要三个包:
msutil.jar,msbase.jar,mssqlserver.jar,可以把这三个包拷贝到BEA_HOME$/weblogic81/server/lib目录内。
Q:
[Microsoft][SQLServer2000DriverforJDBC]Errorestablishingsocket的错误。
该错误主要是没有加载SQLSERVER的驱动程序。
A:
启动sqlserver2000的服务器网络实用工具后,确保Tcp/Ip协议已启动,默认的应该都启动了,这是进行通讯的条件,再选中Tcp/Ip协议后点击属性,就看到了一个默认端口号,这就是你在getConnection里用到的端口号,必须把程序里用到的端口号,写成这里的值。
Q:
连接SQLSERVER正常,但连接后不能使用或提示SQL错误。
A:
该问题主要原因可能是没有给这个用户分配足够的权限,或者你的SQL语句中用到了SQLSERVER里保留的关键字。
Q:
错误:
java.sql.SQLException:
[Microsoft][SQLServer2000DriverforJDBC]Can'tstartaclonedconnectionwhileinmanualtransactionmode.
A:
这个错误产生的原因一般是当你在一个SQLSERVER的JDBC连接上执行多个STATEMENTS的操作,或者是手动事务状态(AutoCommit=false)并且使用direct(SelectMethod=direct)模式.Direct模式是默认的模式.
解决办法
当你使用手动事务模式时,必须把SelectMethod属性的值设置为Cursor(SelectMethod=Cursor),或者是确保在你的连接上只有一个STATEMENT操作。
1.2.4XA-DRIVER与普通DRVIER的区别
Q:
XA的Driver和普通的Driver有什么区别呢?
A:
XA的Driver支持分布式的事务处理,这是与nonxadriver的最大区别;JDBC2.0规范提供了进行分布式事务的能力。
分布式事务是个单独的事务,可以应用在位于分离服务器上的多个异构数据库。
为了支持分布式事务,JDBC2.0提供了两个新的接口:
javax.sql.XADataSource和javax.sql.XAConnection。
从性能的考虑来说,使用XA的DRIVER会比普通的DRIVER慢。
Q:
XA的连接池,选择了支持本地事务后,是否还支持对全局的操作?
A:
8.1既支持TX,也支持Non-Tx的,Weblogic对所有的已知数据库进行了包装(Wrapper),使接口一致,然而对不同的数据库,根据选择的驱动程序不同,都作了相应的优化和处理。
建立数据源时,如果选择Non-Tx类型,那么它参与到JTA事务中也不会出错,因为Weblogic会启动本地事务,但是前提是必须有一个资源(XAResource)参与到事务中(多个资源的话必须打开模拟两阶段提交协议,不然会出错),但是选择Tx类型的就必须有一个全局事务,除非选择支持本地事务(SupportsLocalTransaction=true)。
另外如果使用了本地事务,就必须设置autocommit为true,或者手工commit/rollback。
1.3配置连接池连接OarcleRAC集群。
前提条件必须使用WebLogicServerversion8.1SP3或者是更新的版本。
更详细的内容请查看
http:
//e-
2JDBC连接池使用2.1数据库连接方法总结
数据库名称
连接串
MySQL
Class.forName("org.gjt.mm.mysql.Driver");DriverManager.getConnection("jdbc:
mysql:
//MyDbComputerNameOrIP:
3306/myDatabaseName",sUsr,sPwd);
PostgreSQL
Class.forName("org.postgresql.Driver");
DriverManager.getConnection("jdbc:
postgresql:
//MyDbComputerNameOrIP/myDatabaseName",sUsr,sPwd);
Oracle
Class.forName("oracle.jdbc.driver.OracleDriver");
DriverManager.getConnection("jdbc:
oracle:
thin:
@MyDbComputerNameOrIP:
1521:
ORCL",sUsr,sPwd);
Sybase
Class.forName("com.sybase.jdbc2.jdbc.SybDriver");DriverManager.getConnection("jdbc:
sybase:
Tds:
MyDbComputerNameOrIP:
2638",sUsr,sPwd);
//(Default-Username/Password:
"dba"/"sql")
SQLServer
Class.forName("net.sourceforge.jtds.jdbc.Driver");
DriverManager.getConnection("jdbc:
jtds:
sqlserver:
//MyDbComputerNameOrIP:
1433/master",sUsr,sPwd);
ODBC
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
DriverManager.getConnection("jdbc:
odbc:
"+sDsn,sUsr,sPwd);
DB2
Class.forName(".DB2Driver");
DriverManager.getConnection("jdbc:
db2:
//192.9.200.108:
6789/SAMPLE",sUsr,sPwd);
SAPDB
Class.forName("com.sap.dbtech.jdbc.DriverSapDB");
DriverManager.getConnection("jdbc:
sapdb:
//"+host+"/"+database_name,user_name,password)
InterBase
Class.forName("interbase.interclient.Driver");
DriverManager.getConnection("jdbc:
interbase:
//localhost/e:
/testbed/database/employee.gdb","sysdba","masterkey");
MicrosoftSQLServerseries(6.5,7.xand2000)andSybase10
JDBCName:
jTDS
Class.forName("net.sourceforge.jtds.jdbc.Driver");
DriverManager.getConnection("jdbc:
jtds:
sqlserver:
//host:
port/database","user","password");or
DriverManager.getConnection("jdbc:
jtds:
sybase:
//host:
port/database","user","password");
IBMAS400
有装V4R4以上版本的ClientAccessExpress可以在C:
\ProgramFiles\IBM\ClientAccess\jt400\lib找到driver档案jt400.zip,并更改扩展名成为jt400.jar语法
java.sql.DriverManager.registerDriver(newcom.ibm.as400.access.AS400JDBCDriver());
Class.forName("com.ibm.as400.access.AS400JDBCConnection");con=DriverManager.getConnection("jdbc:
as400:
//IP","user","password");
Informix
Class.forName("com.informix.jdbc.IfxDriver").newInstance();
Stringurl="jdbc:
informix-sqli:
//123.45.67.89:
1533/testDB:
INFORMIXSERVER=myserver;user=testuser;password=testpassword";
2.2数据库连接池使用常见问题2.2.1连接泄漏(poolconnectionleak)
造成的原因一般是在使用连接后没有正确的释放连接,或者是释放的过程中出了错误。
【解决办法】
Connectionleak是一件令人头痛的而又常见的错误,所以BEA提供了两种方式来解决他。
首先,通过GC。
那些没有被正常关闭的connection如果满足可爱的JVMGC的条件,GC会调用Connection的finalize()方法。
而从connectionpool中获取的connection是BEA包装过的。
所以WebLogic会妥善处理这些“孤儿”connection。
通过GC进行connection回收是一种很被动的做法。
BEA在WLS8.1中主动出击。
通过设置weblogic-ra.xml中的inactive-connection-timeout-seconds,BEA会根据设置,主动关闭那些超时idle的connection。
这就需要WLS对以分配出的connection进行周期性的检测,来看其是否活动和是否超时。
关于weblogic-ra.xm的文档如下:
http:
//e-
早在WLS6.1,BEA就已经在考虑自动回收“孤儿”connection了,这从JDBCConnectionPoolRuntimeMBean的getLeakedConnectionCount()方法中可见端倪。
在WLS7.0,8.1中的JDBCConnectionPoolRuntimeMBean中getLeakedConnectionCount一直存在。
在8.1中,增加了通过设置idleconnection的timeout时间主动关闭connection的方式,手段越来越完全了。
关于JDBCConnectionPoolRuntimeMBean的详细情况可以参见以下链接:
http:
//e-
http:
//e-
http:
//e-
http:
//e-
http:
//e-
在Dev2Dev的Codelibrary中已经有了一个例子,通过监听JDBCConnectionPoolRuntimeMBean的LeakedConnectionCount属性,如若其超过一设定值,会发出提醒。
在WLS7.0中已经可以通过GC收leakedconnection了,不过JDBCConnectionPoolRuntimeMBean的getLeakedConnectionCount好像没跟上.
2.2.2处理ORACLE的BLOB字段
1、在SQL3中,定义了一些新的数据类型,包括:
∙BLOB――二进制大对象,对应java.sql.Blob类型。
∙CLOB――字符大对象,对应java.sql.Clob类型。
∙ARRARY――可以存储多个某特定类型的值,对应java.sql.Array类型。
∙STRUCT――这是任何SQL机构类型的缺省映射,对应java.sql.Struct类型。
∙REF――作为数据库中SQL数据的引用,可作为参数传入SQL语句,对应java.sql.Ref类型。
2、java.sql.Blob和java.sql.Clob接口使你能够只把列值加载到内存中。
getBlob()和setBlob()、getClob()和setClob(),允许程序员访问SQLBLOB和CLOB数据类型。
BLOB包含了一个指向该数据的逻辑指针,而不含数据本身。
使用get或set方法是只返回了一个指向该值得指针,应用程序可以读取所需的一些或全部数据。
用weblogic.jdbc.vendor.oracle.OracleThinBlob对象替代oracle.sql.BLOB应该直接读取binayStream,如果采用OCI方式,即ORACLE本身的API连结,可以用读取一个Blob对象,然后转换成输出流,而如果用thin,即通用的JDBC,应该用标准的getBinayStream方法直接读取.是的,如果用thin,必须直接用jdbc,关键是把java.sql.ResultSet换成oracle.jdbc.driver.OracleResultSet,java.sql.Blob换成oracle.sql.BLOB。
物理连接就是驱动程序中的实现java.sql.Connection的对象,逻辑连接就是一个Wraper,它实现Connection接口,并包含一个物理连接的应用,这采用装饰器设计模式,用户得到的不是物理连接,而是得到Con
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WebLogic JDBC Transaction版精华帖整理 Transaction 精华帖 整理