ibatis 处理数据库连接的问题:

yxwonline 2008-11-05 10:21:10
ibatis DB2 连接到一定数目后,ibatis就连不上DB2了,感觉就像ibatis没有释放连接,导致资源耗尽,找不到连接! 第一次用ibatis,不是很清楚,请教大家!
DaoFactory代码:
public class DaoFactory {
public static DaoManager create() {
Reader reader;
DaoManager daoManager = null;
try {
reader = Resources.getResourceAsReader("com/tt/persistence/dao.xml");
daoManager = DaoManagerBuilder.buildDaoManager(reader);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
return daoManager;
}

public static Object getDao(Class in) {
return DaoFactory.create().getDao(in);
}
}

带事物的调用:
try{
DaoManager daoManager = DaoFactory.create();
XXXDao dao = (XXXDao) daoManager.getDao(XXXDao.class);
daoManager.startTransaction();
int i = dao.update();
if(i > -1) {
daoManager.commitTransaction();
}
}catch(Exception e){
e.printStackTrace();
}finally {
daoManager.endTransaction();
}

不带事物的:
XXXDao dao = (XXXDao) daoManager.getDao(XXXDao.class);
dao.select();

ibatis应该是自己管理连接,不需要关心啊,他自己会释放连接的啊,不断刷新页面,访问数据库,内存不断加,当连接数到达DB2最大连接时,就连不上了,那就是连接没有释放哦,怎么解决?
...全文
787 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxwonline 2008-11-08
  • 打赏
  • 举报
回复
版本是2.2吧。
commitTransaction(); 不是提交事物吗? 数据库操作成功才提交事物啊。。。不成功就回滚啊。。。后面finally里面不是有endTransaction() 吗,它不是关链接的吗? 不是很理解!
yxwonline 2008-11-07
  • 打赏
  • 举报
回复
是哦,折腾3天了啊,还没有头绪,现在结构已定,再加spring,又蛮麻烦了. 看来还是要对底层多了解一下啊!
FAT0708 2008-11-07
  • 打赏
  • 举报
回复
没有碰到楼主出现的情况,看你折腾了这么久了,建议把spring加进来,让它去管理连接,这样你就解脱了,呵呵。
yxwonline 2008-11-07
  • 打赏
  • 举报
回复
Pool.RemoveAbandoned 设为true 也试了,一样不行啊, 哎,头疼!
yxwonline 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Landor2004 的回复:]
用sqlMapper
Reader reader = Resources.getResourceAsReader("com/mydomain/data/SqlMapConfig.xml");
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
......
sqlMapper.startTransaction();
......
[/Quote]

try{
DaoManager daoManager = DaoFactory.create();
XXXDao dao = (XXXDao) daoManager.getDao(XXXDao.class);
daoManager.startTransaction();
int i = dao.update();
if(i > -1) {
daoManager.commitTransaction();
}
}catch(Exception e){
e.printStackTrace();
}finally {
daoManager.endTransaction();
}

dao.update()到最后实际上还是通过SqlMapClient的update来操作的, 只不过把sqlMapper在封装了一下的,所以改成sqlMapper 还会是一样的效果吧!
Landor2004 2008-11-07
  • 打赏
  • 举报
回复
你这个ibatis的版本是多少,DaoManager在ibatis2.3中已经不赞成使用了,所以建议直接用sqlMapper

另外
if(i > -1) {
daoManager.commitTransaction();
}
此处有些奇怪,begin和mommit应该是成对出现的,建议修改成
xxx.startTransaction();
int i = dao.update();
xxx.commitTransaction();
yami251139 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yxwonline 的回复:]
我使用的DBCP连接池啊 以下是配置:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
<properties resource="com/tt/persistence/config.properties" />

<transactionManager type="JDBC">
<dataSource type="DBCP">
<property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}"/>
<property name="JDBC.Username" value="${username}"/>
<property name="JDBC.Password" value="${password}"/>
<property name="Pool.MaximumActiveConnections" value="20"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumWait" value="60000"/>
<property name="Pool.RemoveAbandoned" value="false"/>
<property name="Pool.RemoveAbandonedTimeout" value="30000"/>
</dataSource>
</transactionManager>

<sqlMap resource="com/tt/persistence/XXX.xml"/>
</sqlMapConfig>


是这样配的吗?没有错吧,用DBCP连接池的配置?
[/Quote]
================================================
Pool.RemoveAbandonedTimeout

数据库连接被废弃的最大超时时间

Pool.RemoveAbandoned

当连接空闲时间超过RemoveAbandonedTimeout时,是否将其废弃。
================================================
改为true~~~~~~~~
试试看。。。。(*#……¥)#……)#
yxwonline 2008-11-05
  • 打赏
  • 举报
回复
除了用JNDI 还有别的方法吗?
阿甘1976 2008-11-05
  • 打赏
  • 举报
回复
看不出问题,你可以试下采用JndiDataSourceFactory方式,把数据库连接交由J2EE容器管理,而不是与IBATIS集成在一起啊,这样可判断问题出在哪啊。

JndiDataSourceFactory在应用容器内部从JNDI Context中查找DataSource实现。当使用应用服务器,并且服务器提供了容器管理的连接池和相关DataSource实现的情况下,可以使用JndiDataSourceFactory。使用JDBC DataSource的标准方法是通过JNDI来查找。JndiDataSourceFactory必须要配置的属性如下:
<transactionManager type="JDBC" >
<dataSource type="JNDI">
<property name="DataSource" value="java:comp/env/jdbc/jpetstore"/>
</dataSource>
</transactionManager>
yxwonline 2008-11-05
  • 打赏
  • 举报
回复
我使用的DBCP连接池啊 以下是配置:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
<properties resource="com/tt/persistence/config.properties" />

<transactionManager type="JDBC">
<dataSource type="DBCP">
<property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}"/>
<property name="JDBC.Username" value="${username}"/>
<property name="JDBC.Password" value="${password}"/>
<property name="Pool.MaximumActiveConnections" value="20"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumWait" value="60000"/>
<property name="Pool.RemoveAbandoned" value="false"/>
<property name="Pool.RemoveAbandonedTimeout" value="30000"/>
</dataSource>
</transactionManager>

<sqlMap resource="com/tt/persistence/XXX.xml"/>
</sqlMapConfig>


是这样配的吗?没有错吧,用DBCP连接池的配置?
Landor2004 2008-11-05
  • 打赏
  • 举报
回复
用sqlMapper
Reader reader = Resources.getResourceAsReader("com/mydomain/data/SqlMapConfig.xml");
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
......
sqlMapper.startTransaction();
......
阿甘1976 2008-11-05
  • 打赏
  • 举报
回复
通常是应该与数据源一起用的,应该不会有问题啊。
SimpleDataSourceFactory为DataSource提供了一个基本的实现,适用于在没有J2EE容器提供DataSource的情况。它基于iBatis的SimpleDataSource连接池实现。SqlMapConfig.xml中加入

<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="org.postgresql.Driver"/>
<property name="JDBC.ConnectionURL" value="jdbc:postgresql://server:5432/dbname"/>
<property name="JDBC.Username" value="user"/>
<property name="JDBC.Password" value="password"/>
<!-- OPTIONAL PROPERTIES BELOW -->
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime" value="120000"/>
<property name="Pool.TimeToWait" value="10000"/>
<property name="Pool.PingQuery" value="select * from dual"/>
<property name="Pool.PingEnabled" value="false"/>
<property name="Pool.PingConnectionsOlderThan" value="0"/>
<property name="Pool.PingConnectionsNotUsedFor" value="0"/>
</dataSource>
</transactionManager>
liaoyi_ipanel 2008-11-05
  • 打赏
  • 举报
回复
up__
  • 打赏
  • 举报
回复
不好意思,没用过ibatis,也帮不上忙
兄弟只能顶了!
支持
ouyangxiaokang6 2008-11-05
  • 打赏
  • 举报
回复
用过ibatis但是没有出现过lz所说的情况呀。
帮你up.
yxwonline 2008-11-05
  • 打赏
  • 举报
回复
落了,顶起来。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧