`
make19830723
  • 浏览: 34349 次
  • 性别: Icon_minigender_1
  • 来自: 常州
社区版块
存档分类
最新评论

数据库三种连接PooledConnection,XAConnection,Connection(连接三剑客)

阅读更多

现在来分别说说这三种DataSource:


public interface DataSource
该工厂用于提供到此 DataSource 对象表示的物理数据源的连接。作为 DriverManager 设施的替代项,DataSource 对象是获取连接的首选方法。实现 DataSource 接口的对象通常在基于 JavaTM Naming and Directory Interface (JNDI) API 的命名服务中注册。

DataSource 接口由驱动程序供应商实现。共有三种类型的实现:

基本实现 - 生成标准 Connection 对象
连接池实现 - 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。
分布式事务实现 - 生成一个 Connection 对象,该对象可用于分布式事务,并且几乎始终参与连接池。此实现与中间层事务管理器一起使用,并且几乎始终与连接池管理器一起使用。
DataSource 对象的属性在需要时可以修改。例如,如果将数据源移动到另一个服务器,则可更改与服务器相关的属性。其优点是,因为可以更改数据源的属性,所以任何访问该数据源的代码都无需更改。

通过 DataSource 对象访问的驱动程序不会向 DriverManager 注册。通过查找操作检索 DataSource 对象,然后使用该对象创建 Connection 对象。使用基本的实现,通过 DataSource 对象获取的连接与通过 DriverManager 设施获取的连接相同。





public interface ConnectionPoolDataSourcePooledConnection 对象的工厂。实现此接口的对象通常在基于 JavaTM Naming and Directory Interface (JNDI) 的命名服务中注册。




public interface XADataSource在内部使用的 XAConnection 对象的工厂。实现 XADataSource 接口的对象通常在使用 Java Naming and Directory InterfaceTM (JNDI) 的命令服务中注册。




三种连接:

与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。

Connection 对象的数据库能够提供信息描述其表、所支持的 SQL 语法、存储过程和此连接的功能等。此信息是使用 getMetaData 方法获得的。

注:默认情况下,Connection 对象处于自动提交模式下,这意味着它在执行每个语句后都会自动提交更改。如果禁用自动提交模式,为了提交更改,必须显式调用 commit 方法;否则无法保存数据库更改。

使用 JDBC 2.1 核心 API 创建的 Connection 对象有一个与之关联的最初为空的类型映射表。用户可以为此类型映射表中的 UDT 输入一个自定义映射关系。在使用 ResultSet.getObject 方法从数据源中检索 UDT 时,getObject 方法将检查该连接的类型映射表,以查看是否有对应该 UDT 的项。如果有,那么 getObject 方法会将该 UDT 映射到所指示的类。如果没有项,则会使用标准映射关系映射该 UDT。

用户可以创建一个新的类型映射表,该映射表是一个 java.util.Map 对象,可在其中创建一个项,并将该项传递给可以执行自定义映射关系的 java.sql 方法。在这种情况下,该方法将使用给定的类型映射表,而不是与连接相关联的映射表。







public interface PooledConnection为连接池管理提供挂钩的对象。PooledConnection 对象表示到数据源的物理连接。该连接在应用程序使用完后可以回收而不用关闭,从而减少了需要建立连接的次数。

应用程序员不直接使用 PooledConnection 接口,而是通过一个管理连接池的中间层基础设施使用。

当应用程序调用 DataSource.getConnection 方法时,它取回 Connection 对象。如果连接池已完成,则该 Connection 对象实际上是到 PooledConnection 对象的句柄,这是一个物理连接。

连接池管理器(通常为应用程序服务器)维护 PooledConnection 对象的池。如果在池中存在可用的 PooledConnection 对象,则连接池管理器返回作为到该物理连接的句柄的 Connection 对象。如果不存在可用的 PooledConnection 对象,则连接池管理器调用 PooledConnection 方法 getConnection 创建新的物理连接并返回一个到它的句柄。

当应用程序关闭连接时,它调用 Connection 方法 close。完成连接池时,连接池管理器将得到通知;因为它曾使用 ConnectionPool 方法 addConnectionEventListener 作为 ConnectionEventListener 对象注册它自身。连接池管理器释放到 PooledConnection 对象的句柄,并将 PooledConnection 对象返回到连接池,以便再次使用。因此,当应用程序关闭其连接时,基础物理连接会被回收而不是被关闭。

在连接池管理器调用 PooledConnection 方法 close 之前,物理连接不会被关闭。调用此方法通常是为了按顺序关闭服务器,也可能在发生了严重错误,导致连接变得不可用时调用。





public interface XAConnectionextends PooledConnection为分布式事务提供支持的对象。可以通过 XAResource 对象在分布式事务中利用 XAConnection 对象。事务管理器(通常为中间层服务器的一部分)通过 XAResource 对象管理 XAConnection 对象。

应用程序员不直接使用此接口,而是通过运行于中间层服务器的事务管理器使用。






在Mysql中,有对xa的实现;

package org.corey.xa;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.ConnectionEvent;
import javax.sql.ConnectionEventListener;
import javax.sql.XAConnection;
import javax.sql.XADataSource;

import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;

public class XADemo {

    public static XADataSource getXADataSource() {
        MysqlXADataSource dataSource = new MysqlXADataSource();
        dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/test");
        dataSource.setUser("root");
        dataSource.setPassword("******");
        return dataSource;

    }

    public static XAConnection getXAConnetion(XADataSource dataSource) {
        XAConnection XAConn = null;
        try {
            XAConn = dataSource.getXAConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return XAConn;
    }

    public static Connection getConnection(XAConnection XAConn) {
        Connection conn = null;
        try {
            conn = XAConn.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    public static void closeConnection(Connection conn) {
        try {
            conn.close();
        } catch (SQLException e) {
            System.out.println("连接关闭失败");
        }
    }

    public static void main(String[] args) {
        XADataSource dataSource = XADemo.getXADataSource();
        XAConnection xaConn = XADemo.getXAConnetion(dataSource);
        xaConn.addConnectionEventListener(new ConnectionEventListener() {

            public void connectionClosed(ConnectionEvent event) {
                System.out.println("连接被关闭");
            }

            public void connectionErrorOccurred(ConnectionEvent event) {
                System.out.println("连接发生错误");
            }
        });
        Connection conn = XADemo.getConnection(xaConn);
        try {
            Statement statement=conn.createStatement();
            statement.executeUpdate("insert into customer(name) values('corey')");
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {   
                        //关闭连接,但物理连接没有关闭,
            conn.close();
                        //再次获得连接;
            conn=xaConn.getConnection();
            Statement statement2=conn.createStatement();
            statement2.executeUpdate("insert into customer(name) values('syna')");
        } catch (SQLException e) {
            System.out.println("关闭连接失败");
        }
    }
}

database中插入两条记录;
console打印:
          连接被关闭



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/turkeyzhou/archive/2008/10/13/3071683.aspx
  • 大小: 5 KB
分享到:
评论

相关推荐

    JAVA数据库连接池类

    总的来说,这个 `ConnectionPool` 类提供了一种基本但实用的机制来管理数据库连接。开发者可以根据自己的需求进行扩展,比如添加线程安全控制、连接超时处理、连接健康检查等特性,以适应更复杂的企业级应用场景。...

    MySql数据库连接池C#代码(有注释含测试代码)

    MySQL数据库连接池是提高应用程序性能的一种重要技术,它允许开发者管理多个数据库连接并高效地复用这些连接,而不是每次需要时都创建新的连接。在C#编程中,我们可以使用自定义的连接池或者第三方库如ADO.NET的...

    java手写数据库连接池

    通过创建三个线程并发访问数据库,可以测试连接池在多线程环境下的性能和稳定性。每个线程会从连接池中获取连接,执行SQL操作,然后归还连接。测试应包括成功获取连接、正确执行查询以及在高并发下防止资源冲突的...

    c3p0数据库连接池所需jar包

    3. `PooledConnection`:代表数据库连接池中的一个物理连接,它封装了真实的数据库连接,并增加了监控和管理功能。 三、C3P0配置 在使用C3P0之前,需要将其对应的jar包(如c3p0-0.9.1.2.jar)添加到项目的类路径中...

    用Java写连接池 数据库连接池

    5. **连接对象(PooledConnection)**:包装了实际的数据库连接,提供透明的获取和释放连接的接口。 在设计数据库连接池时,我们需要考虑以下几个重要的特性: - **线程安全**:由于多线程环境下的并发访问,连接...

    数据库连接池的实现(java版本)

    - **连接池**:一种管理数据库连接的技术,可以在程序启动时预先创建一定数量的连接,并将这些连接保存在一个容器(通常是集合类型)中,当应用程序需要访问数据库时,可以直接从连接池中获取连接使用,而不需要每次...

    Java数据库连接池[借鉴].pdf

    Java数据库连接池是一种高效管理数据库连接的技术,它避免了频繁创建和关闭数据库连接导致的性能开销。Apache Commons DBCP是Java中常用的数据库连接池实现之一,它提供了便捷的方式来管理和复用数据库连接,从而...

    学习数据库连接池的好代码

    本文将深入解析标题为“学习数据库连接池的好代码”的压缩包中的三个文件:`ConnectionPool.java`、`PooledConnection.java`以及`Test.java`,并解释它们在数据库连接池实现中的核心概念和机制。 首先,`Connection...

    数据库连接池的基本原理

    数据库连接池是一种用于存储、管理和重用预创建的数据库连接的技术。在没有连接池的情况下,每次应用程序需要访问数据库时,都需要创建一个新的数据库连接,完成数据操作后再关闭该连接。这种模式不仅效率低下,而且...

    Java实现数据库连接池..docx

    连接池是一种缓存技术,它管理数据库连接,避免每次需要访问数据库时创建新的连接,从而提高应用程序的性能。频繁地建立和关闭数据库连接会消耗大量资源,而连接池通过复用已存在的连接来优化这一过程。 在传统的 ...

    java-JDBC学习笔记(java连接数据库编程)

    DataSource提供了获取数据库连接的标准化方式,而不是直接使用`DriverManager.getConnection()`。通过DataSource,开发者可以配置连接池的参数,如最大连接数、超时时间等,以优化资源使用。 JDBC Driver是JDBC与...

    mybatis的连接池理解.docx

    当应用需要一个新的数据库连接时,`PooledDataSource` 的 `getConnection()` 方法首先会尝试从 `idleConnections` 集合中获取一个空闲的 `PooledConnection`。如果 `idleConnections` 中没有可用连接,那么会检查 `...

    oracle9i 自带连接池Java代码

    Oracle连接池是一种用于存储、管理和重用数据库连接的对象池。它能够通过预创建一定数量的数据库连接,并将这些连接保存在一个池中,当应用程序需要使用数据库连接时,可以直接从池中获取一个已经建立好的连接,而不...

    用 JDBC 管理数据库连接.doc

    连接池是一种优化技术,预先创建并维护一组数据库连接,供多个请求共享。这减少了每次应用需要新连接时的开销,提高效率。PooledConnection对象是JDBC连接池的一部分,允许更精细的控制和管理。 ### 优化数据库通讯...

    java连接池实例[参考].pdf

    Java数据库连接池(JDBC Connection Pool)是一种管理数据库连接的技术,它通过复用已存在的数据库连接,而不是每次需要时都创建新的连接,从而提高应用程序的性能和效率。Apache Commons DBCP是Java中一个常用的...

    C3P0连接池.zip

    C3P0连接池是一个广泛使用的Java数据库连接池实现,它允许程序在多个数据库操作之间重用数据库连接,从而提高应用程序的性能和效率。...但无论选择哪种连接池,理解其工作原理和配置策略都是提升项目性能的关键。

Global site tag (gtag.js) - Google Analytics