jdbc查询需要手动提交事务吗?

山城忙碌人 2010-09-17 06:22:42
如题:
public Connection getCon() throws SQLException {
Connection con = null;
ComboPooledDataSource combo = new ComboPooledDataSource("master");
con = combo.getConnection();
con.setAutoCommit(false);//这里已经设置手动提交事务了。
return con;
}

问题一://c3p0的ComboPooledDataSource 这个对象需要我们手动关闭吗?
问题二:请问下查询时(一个业务包含多次增删改查)需要手动提交事务吗?

问题三:本地数据库用sqlserver2005(以前用2000,系统重安装后用2005,项目运行一切正常),服务器数据库sqlserver2000,为什么放到服务器就出现接收TDS 预登录响应时发生 I/O 错误

求高人解决。。。
...全文
1073 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
van_bo11 2010-09-18
  • 打赏
  • 举报
回复
每天进步一点点 学习了。。。
小灰狼 2010-09-18
  • 打赏
  • 举报
回复
查询操作不需要提交
softkingston 2010-09-18
  • 打赏
  • 举报
回复
查询是没有事务的,
djo008 2010-09-18
  • 打赏
  • 举报
回复
问题3:楼主可以看下这个帖子哦,相当详细
http://hi.baidu.com/waterpub/blog/item/65af46cef9ea431d01e928d2.html
lp19890601 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 bisubisu 的回复:]
如题:
问题三:本地数据库用sqlserver2005(以前用2000,系统重安装后用2005,项目运行一切正常),服务器数据库sqlserver2000,为什么放到服务器就出现接收TDS 预登录响应时发生 I/O 错误。[/Quote]

驅動換了沒有
lp19890601 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liudun1988 的回复:]
1.手动关闭。
2.手动提交,防止事务出错,可以回滚。
[/Quote]

查詢不需要提交事務..........沒有改變數據庫的內容。不需要提交事務。
liudun1988 2010-09-18
  • 打赏
  • 举报
回复
1.手动关闭。
2.手动提交,防止事务出错,可以回滚。
jason69181 2010-09-18
  • 打赏
  • 举报
回复
"jdbc查询需要手动提交事务吗?"

看情况,系统默认是AutoCommit(true).

有的时候,为防止提交的事务出错或者发生其他不可预测的情况编码的时候,习惯将AutoCommit设为false

并手动提交,最后将AutoCommit设回原来的状态即AutoCommit(true).


山城忙碌人 2010-09-18
  • 打赏
  • 举报
回复
bao110908
请问一下,我这样做行吗?
客户端调用的都是同一个serverlvt。在这个serverlet里面.我声明ComboPooledDataSource combo对象,
在init方法里创建new ComboPooledDataSource("XXXX") 对象,把combo传到业务层,在业务层里获得Connection对象,最后在destroy方法里关闭ComboPooledDataSource对象.这样可以吗?

具体实现如下:

public class Servlet extends HttpServlet{
//启动服务器调用
public void init() throws ServletException {
combo = new ComboPooledDataSource("master");
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response(combo);//把combo 传过去。其它省略

}

//这里关闭它。
public void destroy() {
combo.close();
}
}


业务层:
public void response(ComboPooledDataSource combo){
Connection con = DbUtil.dbUtil().getCon(combo);
}

DbUtil代码如下
public Connection getCon(ComboPooledDataSource combo) throws SQLException {
Connection con = null;
con = combo.getConnection();
con.setAutoCommit(false);
return con;
}



这样写可以吗,希望大家批评一下。。呵呵。。
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 bisubisu 的回复:]

bao110908
我的程序是这样的。
客户端访问我固定的serverlet,serverlet调用server,在这个server层通过客户端传的字符串判断调用哪一个接口,并在这时创建ComboPooledDataSource对象,并将这个对象传给doWork去执行,在doWork里得到这个Connection对象,执行完后关闭ComboPooledDataSource这个对象。
也就是……
[/Quote]

这样做与直接使用 JDBC 有什么区别?干嘛还耗费时间去创建 ComboPooledDataSource 对象?

连接池是可以用于整个程序的生命周期中,像这样每个请求创建一个连接池,用完一次后马上再关掉,肯定是有问题的。
山城忙碌人 2010-09-18
  • 打赏
  • 举报
回复
lp19890601
驱动没换
djo008谢谢你的文章,这个我看了,他说的是2005,我服务器用的是2000,可能是配置文件有问题:
我的配置文件如下。
<property name="driverClass">
net.sourceforge.jtds.jdbc.Driver
</property>
<property name="jdbcUrl">
jdbc:jtds:sqlserver://127.0.0.1:1433/cimunion
</property>
<property name="user">sa</property>
<property name="password">root_</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">5</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">50</property>
<property name="minPoolSize">5</property>
<property name="maxStatements">20</property>
<property name="maxStatementsPerConnection">5</property>
</named-config>
山城忙碌人 2010-09-18
  • 打赏
  • 举报
回复
bao110908
问题三:本地数据库用sqlserver2005(以前用2000,系统重安装后用2005,项目运行一切正常),服务器数据库sqlserver2000,为什么放到服务器就出现接收TDS 预登录响应时发生 I/O 错误。
------------------------------------------------------------------------
不明

是这样的,服务器数据库是sqlserver2000,我电脑以前用的也是2000,电脑系统重安装后我就用2005了,服务器tomcat启动的时候就地出现:
出现接收TDS 预登录响应时发生 I/O 错误。
山城忙碌人 2010-09-18
  • 打赏
  • 举报
回复
bao110908
我的程序是这样的。
客户端访问我固定的serverlet,serverlet调用server,在这个server层通过客户端传的字符串判断调用哪一个接口,并在这时创建ComboPooledDataSource对象,并将这个对象传给doWork去执行,在doWork里得到这个Connection对象,执行完后关闭ComboPooledDataSource这个对象。
也就是说当客户端访问我服务端一次我就创建一个ComboPooledDataSource对象,用完就关闭它,这样也会严重的资源泄漏吗?如果会,有什么好的解决办法吗?

//获得数据库资源我是这样写的。
public Connection getCon(ComboPooledDataSource combo) throws SQLException {
Connection con = null;
con = combo.getConnection();
con.setAutoCommit(false);
return con;
}
  • 打赏
  • 举报
回复
问题一://c3p0的ComboPooledDataSource 这个对象需要我们手动关闭吗?
----------------------------------------------------------------------
这个对象只要创建一次就可以了,尽量能手动关闭掉,比如在 Servlet 容器中某个 Servlet 的 detroy 方法中关闭。


问题二:请问下查询时(一个业务包含多次增删改查)需要手动提交事务吗?
-----------------------------------------------------------------------
查询不需要事务


问题三:本地数据库用sqlserver2005(以前用2000,系统重安装后用2005,项目运行一切正常),服务器数据库sqlserver2000,为什么放到服务器就出现接收TDS 预登录响应时发生 I/O 错误。
------------------------------------------------------------------------
不明
  • 打赏
  • 举报
回复
MS SQL Server JDBC 的相关资料没有找到,手头也没有相关软件,你自己试试看吧。
  • 打赏
  • 举报
回复
JDBC 规范并没有对此明确,不过大多数的 JDBC 驱动并不会将其提交。

如果使用连接池的话,在 c3p0 中可以将 autoCommitOnClose 属性值设为 true,在关闭时会进行提交,否则就采用默认值 false

这就像在数据库界面客户端执行一下,如果不执行 commit 的话,就不会提交。


Oracle 的话,如果开启事务但并不 commit 而强行结束的话 Oracle 会自动回滚事务。

Oracle recommends that you explicitly end every transaction in your application programs with a COMMIT or ROLLBACK statement, including the last transaction, before disconnecting from Oracle Database. If you do not explicitly commit the transaction and the program terminates abnormally, then the last uncommitted transaction is automatically rolled back.
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4010.htm#SQLRF01110


MySQL 也是如此:

如果你关闭autocommit模式并且关闭一个连接而不调用你的事务的明确提交,则MySQL回滚你的事务。
http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-implicit-command-or-rollback

另外,你的代码有问题!

public Connection getCon() throws SQLException {
Connection con = null;
ComboPooledDataSource combo = new ComboPooledDataSource("master");
con = combo.getConnection();
con.setAutoCommit(false);//这里已经设置手动提交事务了。
return con;
}

ComboPooledDataSource 只要创建一次就可以了,你这样的创建会造成严重的资源泄漏!
山城忙碌人 2010-09-18
  • 打赏
  • 举报
回复
djo008
我本地用2000,服务器用2000的时候地切都正常,但为什么我本地换成2005后,服务器除了我程序外,其它的一切都没动,为什么会出现这个错误呢?

81,095

社区成员

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

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