`
supttkl
  • 浏览: 17710 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

浅谈对jdbc和jtds的一些认识

    博客分类:
  • java
阅读更多
最近做项目用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)

}






分享到:
评论

相关推荐

    JTDS和JDBC连接Sybase数据库

    标题中的“JTDS和JDBC连接Sybase数据库”涉及到的是Java开发中的一种数据库连接技术,主要聚焦于如何通过Java应用程序与Sybase数据库进行交互。Sybase是一种流行的关系型数据库管理系统,广泛应用于企业级应用中。...

    jtds JDBC连接驱动

    总之,`jtds`作为一个高效、轻量级的JDBC驱动,是连接SQL Server的理想选择,尤其适合那些对性能有较高要求的项目。通过理解其特性和使用方式,开发者可以充分利用其优势,实现更加高效的数据访问。

    ms sql 驱动包(sqljdbc.jar 和jtds.jar)

    标题中提到的"ms sql 驱动包(sqljdbc.jar 和jtds.jar)"是指两种不同的Java数据库连接器(JDBC)驱动,它们用于在Java应用中与SQL Server进行通信。这两个驱动包分别是: 1. **sqljdbc.jar**:这是Microsoft官方...

    hibernate中连接sqlserver的JDBC包jtds

    JTDS是一个开放源代码的100%纯Java的,用于JDBC 3.0驱动Microsoft SQL Server (6.5 ,7 ,2000和2005版本)驱动程序。在hibernate连接sqlserver数据库时最好用这个。。

    sql2005/sql2008驱动包(sqljdbc与jtds-1.2.5两种)

    这里我们关注的是SQL Server 2005和2008数据库的Java连接驱动,具体包括sqljdbc与jtds-1.2.5两种。这两种驱动包允许Java应用程序通过JDBC(Java Database Connectivity)接口与SQL Server进行通信。 首先,让我们...

    jtds,mysql,oracle,sqlserver数据库驱动与连接字符串

    它的优点在于提供了对这些数据库的轻量级、高效率的连接,使得Java应用程序能够无缝地与SQL Server和Sybase交互。jtds的连接字符串通常包含以下元素:`jdbc:jtds:sqlserver://&lt;服务器地址&gt;:&lt;端口号&gt;/&lt;数据库名&gt;;...

    java链接数据库jtds和sqljdbc

    这里我们将深入探讨使用JDBC(Java Database Connectivity)驱动程序jTDS和sqljdbc来连接到数据库的过程,以及它们各自的特点和使用场景。 首先,JDBC是Java平台的一个标准接口,它允许Java应用程序与各种类型的...

    android_sqlserver_jdbc_jtds-1.2

    Android 直接连接SqlServer数据库,jtds-1.2.jar,JTDS是一个开放源代码的100%纯Java的,用于JDBC 3.0驱动Microsoft SQL Server (6.5 ,7 ,2000和2005版本)和Sybase(10 ,11 ,12 ,15 版本)的驱动程序

    jdbc-odbc jtds 连接字符串

    - **JTDS(JDBC to ODBC)**:JTDS是JDBC的一个开源实现,它提供了一个兼容Microsoft SQL Server和Sybase数据库的驱动程序,支持T-SQL语言。JTDS的主要优势在于其对SQL Server的兼容性和性能优化。 - **URL格式**:`...

    jtds-1.3.1-jdbc.rar

    本文将深入探讨一款名为jtds的开源JDBC驱动,版本为1.3.1,它专门用于连接Microsoft SQL Server和Sybase数据库,为开发者提供高效且灵活的数据访问方式。 jtds是一款高性能、开源的JDBC驱动程序,由NetSourceForge...

    jtds-1.2.7.jar+sqljdbc.jar

    Jtds以其高效、兼容性和对新SQL Server特性支持而著名,它支持包括JDBC 3.0和4.0在内的多种API,并且在某些情况下比Microsoft官方的JDBC驱动(即sqljdbc.jar)表现更优,特别是在处理大量数据时。 接着,我们讨论...

    SQLSERVER官方驱动 jtds-1.3.1 mssql-jdbc-7.0.0.jre8 sqljdbc42

    sqljdbc42是微软早期为Java 8提供的一个官方驱动版本,它是sqljdbc4的升级版,增加了对Java 8的支持和一些新功能。尽管现在已经被mssql-jdbc驱动所取代,但在某些旧项目或特定环境中,sqljdbc42仍有可能被使用。 ...

    osgi-jdbc-jtds:附加到 JTDS 以导出 org.osgi.service.jdbc.DataSourceFactory OSGi 服务

    osgi-jdbc-jtds 基于 JTDS JDBC 驱动程序注册 org.osgi.service.jdbc.DataSourceFactory OSGi 服务的 JTDS 的 Appender。 在调用和函数期间,可以定义以下属性: 类中定义的所有属性 如果通过使用和类的常量复制...

    jtds1.2.4+sqljdbc4.2.0两个jar包文件

    JTDs 1.2.4 版本提供了对一些高级特性的支持,例如支持多数据源,这意味着开发者可以更灵活地管理多个数据库连接,提高应用的可扩展性和可用性。 其次,`sqljdbc4-2.0.jar`是Microsoft官方提供的JDBC驱动,它同样...

    jtds.jdbc.Driver ,连接 SQL Server 所需驱动

    jTDS是基于freeTDS的,并且是最快的可企业级应用的SQL Server和Sybase的JDBC驱动程序。 jTDS完全与JDBC3.0兼容,支持只向前和可滚动/可更新的结果集(ResultSets),并且支持完全独立的并行Statements

    jtds-1.3.0.jar 和jtds-1.3.1.jar sqlserver驱动

    String url = "jdbc:jtds:sqlserver://"+dbInfo.getIp()+":"+dbInfo.getPort()+"/" + dbInfo.getServiceName(); Class.forName("net.sourceforge.jtds.jdbc.Driver");

    jdbc.rar_jtds

    而jtds是一个实现了JDBC驱动程序接口的库,专注于提供对Microsoft SQL Server和Sybase Adaptive Server的低级网络协议的支持,这使得它比官方的Microsoft JDBC驱动更轻量级,性能上也有所优势。 jtds的主要特点包括...

    常见的数据库包(odbc7,mysql-connector,sqljdbc,jtds,db2,ifxjdbc)

    这里我们讨论的是一些常见的数据库驱动包,包括odbc7, mysql-connector, sqljdbc, jtds, db2, ifxjdbc以及kingbase。这些驱动包各自对应不同的数据库系统,为开发者提供了方便的数据访问接口。 1. **ODBC7**: ODBC...

    jTDS - SQL Server and Sybase JDBC driver 1.2.2 正式版(含源码)

    jTDS - SQL Server and Sybase JDBC driver 1.2.2 正式版 &lt;br&gt;一个Microsoft SQL Server数据库的Jdbc driver。开源的非常好用。 下载地址:http://jtds.sourceforge.net/&lt;br&gt;&lt;br&gt;&lt;br&gt;

Global site tag (gtag.js) - Google Analytics