浅谈对jdbc和jtds的一些认识

最近做项目用SQLSERVER2000的数据库,使用JTDS开源的驱动,跟大家谈谈个人对JDBC的一些理解。
一个DateSource可以获取多个Connection,一个Connection可以打开多个Statement,一个Statement可以打开多个ResultSet。如果我直接

conn.close();仔细翻看jtds源代码。在底层是这样实现的。
Connection------------------------close方法

synchronized public void close() throws SQLException {
if (!closed) {
try {
//
// Close any open statements
//
ArrayList tmpList;

synchronized (statements) {
tmpList = new ArrayList(statements);
statements.clear();
}

for (int i = 0; i < tmpList.size(); i++) {
WeakReference wr = (WeakReference)tmpList.get(i);

if (wr != null) {
Statement stmt = (Statement) wr.get();
if (stmt != null) {
try {
stmt.close();
} catch (SQLException ex) {
// Ignore
}
}
}
}

try {
// Tell the server the session is ending
baseTds.closeConnection();
// Close network connection
baseTds.close();
// Close cached TdsCore
if (cachedTds != null) {
cachedTds.close();
cachedTds = null;
}
} catch (SQLException ex) {
// Ignore
}

socket.close();
} catch (IOException e) {
// Ignore
} finally {
closed = true;
}
}
}


statement------------------------close方法

public void close() throws SQLException {
if (!closed) {
SQLException closeEx = null;
try {
closeAllResultSets();
} catch (SQLException ex) {
if (!"HYT00".equals(ex.getSQLState())
&& !"HY008".equals(ex.getSQLState())) {
// Only throw exceptions not caused by cancels or timeouts
closeEx = ex;
}
} finally {
SQLException releaseEx = null;
try {
if (!connection.isClosed()) {
connection.releaseTds(tds);
}
// Check for server side errors
tds.getMessages().checkErrors();
} catch (SQLException ex) {
// Remember any exception thrown
releaseEx = ex;
// Queue up any result set close exceptions
if (closeEx != null) {
releaseEx.setNextException(closeEx);
}
} finally {
// Clean up everything
closed = true;
tds = null;
connection.removeStatement(this);
connection = null;

// Re-throw any caught exception
if (releaseEx != null) {
throw releaseEx;
}
}
}
// Throw any exception caught during result set close
if (closeEx != null) {
throw closeEx;
}
}
}

看起来是如果关闭Connection,那么在此Connection上打开的所有Statement会关闭,如果关闭Statement那么在此Statement上打开的所有的

ResultSet也会关闭。如果没有特殊需要,直接关闭Connection即可。

那么在什么情况下需要先关闭ResultSet,然后关闭Statement。然后关闭Connection呢?

仔细翻看Jtds的文档。找到了以下内容:
JDBC Concurrency : CONCUR_UPDATABLE+1
SQL Server Concurrency: Pessimistic concurrency, updatable
Row Locks: Yes
Description : Row integrity isensured by locking rows


意思就是当
Statement st=Connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE+1);
ResultSet rs=st.executeQuery("SELECT * FROM TABLE2 where id=1");
rs.updateString(1,"test");
rs.updateRow() ;

该结果集就会锁定当前行,其他ResultSet不得访问。
这个时候ResultSet应当尽可能早的close()。以便释放资源。

web服务器会为每次请求创建一个线程。也就是说一次request打开一次连接即可!在一次连接上创建多个Statement。
写一个监听器,每次销毁request的时候释放数据库连接。
http://supttkl.iteye.com/admin/blogs/181419

JTDS虽然实现了数据源,但是没有实现实现连接池。所以还要借助中间件的连接池,如dbcp。。。

ConnectionJDBC2没有实现Savepoint保存点。ConnectionJDBC3实现了保存点.
那么什么时候使用保存点事务呢?
个人理解:
a向b借钱,b当时没有钱,然后到银行取出钱后委托给c,又c将钱转交给a
等c将钱转交给a的时候,发生了意外。那么钱应该在c手中,事务应该回滚到c,而不应该回滚到b。因为钱已经在c手中。
Connection conn=getConnetion();
conn.setAutoCommit(false);//启动事务
//b取钱
PreparedStatement pst=conn.prepareStatement("select * from money where bid=1");
ResultSet rs=pst.exeQuery();
int money=rs.getInt("money");
Savepoint savepoint=conn.setSavepoint("pointc");
//b将钱转交给c
PreparedStatement pst2=conn.prepareStatement("update table set money + ?");
pst2.setInt(1, money);
pst2.execute();
//c将钱转交给a的时候,出现了异常,如a不在家。
try{
PreparedStatement pstc=conn.prepareStatement("update table set money - ?");
pstc.setInt(money);
pstc.execute();
PreparedStatement psta=conn.prepareStatement("update table set money + ?");
psta.setInt(money);
psta.execute();
}catch(SQLException e){
//回滚到c
conn.rollback(savepoint)

}
### 回答1: jtds-1.2.7.jar和sqljdbc.jar都是Java开发中与数据库连接相关的库文件。 jtds-1.2.7.jar是一个开源的Java数据库连接驱动,它提供了与SQL Server数据库的连接功能。它的使用非常简单,只需要将该库文件添加到Java项目的classpath中,然后使用相应的类和方法来建立与SQL Server数据库的连接、执行SQL语句和获取查询结果等操作。它支持连接池、批处理操作和多线程并发访问等高级特性,使得开发人员可以更方便地与SQL Server数据库进行交互。 sqljdbc.jar是微软提供的官方Java数据库连接驱动,它主要用于连接和操作SQL Server数据库。与jtds-1.2.7.jar类似,使用sqljdbc.jar也需要将该库文件添加到Java项目的classpath中,然后使用相应的类和方法来连接和操作SQL Server数据库。sqljdbc.jar提供了与SQL Server特定功能相适配的API,例如可用于处理大型数据的流式结果集、支持数据库元数据信息的获取和更新等。此外,sqljdbc.jar还支持SSO(Single Sign-On)身份验证,使得应用程序可以利用操作系统级别的身份验证来连接SQL Server。 总的来说,jtds-1.2.7.jar和sqljdbc.jar都是用于Java与SQL Server数据库连接的库文件,提供了连接、执行SQL语句和获取查询结果等功能,但jtds-1.2.7.jar是开源的,而sqljdbc.jar是由微软官方提供的。选择使用哪个库文件取决于具体的开发需求和个人偏好。 ### 回答2: jtds-1.2.7.jar和sqljdbc.jar是两个不同的Java数据库连接驱动程序。 jtds-1.2.7.jar是一个开源的Java数据库连接驱动程序,用于连接SQL Server数据库。它是一个纯Java实现的驱动程序,可以在不同的操作系统上运行,包括Windows、Linux和Mac等。它提供了高性能的连接和数据访问功能,同时支持SQL Server的各种特性和功能,如事务处理、存储过程、游标等。此外,jtds-1.2.7.jar还提供了一些额外的功能,如连接池和连接负载平衡等,可以进一步提高应用程序的性能和可伸缩性。 sqljdbc.jar是Microsoft官方提供的Java数据库连接驱动程序,用于连接SQL Server数据库。它是针对SQL Server定制的驱动程序,提供了与SQL Server数据库的高度集成和兼容性。它支持最新的SQL Server版本,并提供了一些特殊的功能和优化,如透明的Windows身份验证、与操作系统集成的加密、弹性连接池等。sqljdbc.jar可以在Windows操作系统下运行,并与Java应用程序无缝集成。 jtds-1.2.7.jar和sqljdbc.jar都是用于连接SQL Server数据库的Java驱动程序,它们的选择取决于应用程序的需求和特定的环境。如果您希望使用一个开源的驱动程序,并且在多个操作系统上运行,那么jtds-1.2.7.jar可能是一个合适的选择。但如果您需要与SQL Server的特定功能和优化完全集成,并在Windows环境下运行,那么sqljdbc.jar可能更适合您的需求。最终,选择哪个驱动程序应根据具体情况来决定。 ### 回答3: jtds-1.2.7.jar和sqljdbc.jar是两个在Java开发中用于连接和操作数据库的jar包。 jtds-1.2.7.jar是一个开源的Java数据库连接(JDBC)驱动程序,用于连接和操作Microsoft SQL Server和Sybase数据库。它是由JBoss公司开发的,具有高性能和稳定性。jtds-1.2.7.jar支持连接池、多线程和事务等功能,可以通过在代码中引入相应的类文件来使用。 sqljdbc.jar是微软提供的用于连接和操作SQL Server数据库的官方JDBC驱动程序。它是在Microsoft JDBC Driver for SQL Server项目下开发的,可以与Java应用程序和SQL Server数据库之间建立连接,并执行各种数据库操作。sqljdbc.jar支持连接池、事务和存储过程等功能,可以在代码中引入相关的类文件来使用。 这两个jar包都是用于在Java开发中连接和操作数据库的工具,但是它们的开发和支持方不同。jtds-1.2.7.jar是一个开源项目,由JBoss公司提供支持,而sqljdbc.jar是由微软直接提供的官方驱动程序。 选择使用哪个jar包取决于具体的需求和开发环境。一般来说,如果需要连接和操作Microsoft SQL Server或Sybase数据库,可以考虑使用jtds-1.2.7.jar;如果需要连接和操作SQL Server数据库,并且需要获得微软官方的支持和更新,可以考虑使用sqljdbc.jar。 总之,jtds-1.2.7.jar和sqljdbc.jar是两个常用的用于连接和操作数据库的jar包,开发者可以根据具体的需求选择使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值