`
make19830723
  • 浏览: 33700 次
  • 性别: 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
分享到:
评论

相关推荐

    DBConnectionPool.rar_Java 线程池_True_线程 连接池

    private String dbDiv = "" // 数据库驱动 private String dbUrl = "" // 数据 URL ... pooledConnectionVector = null // 存放连接池中数据库连接的向量 , 初始时为 null 存放的对象为 PooledConnection 型

    jdbc学习全程

    该教程包含jdbc数据库连接的方方面面,非常详细,也包含大量实例,是非常好的学习资料和参考资料教你,本教程说明了怎样使用 JDBC 连接到数据库。虽然这个主题看起来乏味,但事实上它对于新手和老手来说都是一块绊脚...

    VereORM至简持久层微架构

    <dataSource class="com.vere.orm.db.pool.PooledConnection"> <id name="id" column="id" generator="assign" /> <!-- 表的主键 id 1.assign 手动设置 2.auto_increment 数据库...

    前端-后端java的Util类的工具类

    卷 文档 的文件夹 PATH 列表 卷序列号为 000C-BB91 E:. │ config.properties │ Dao.java │ GeneratorDemo.java │ hibernate.cfg.xml │ HibernateDaoImpl.java │ HibernateSessionFactory.java ...

    波士顿房价数据集Boston House Price

    波士顿房价数据集Boston House Price 全网最便宜

    FPGA实现UDP协议(包括ARP、ICMP)

    三种实现FPGA实现UDP协议的代码工程(包括ARP、ICMP),包含使用设计文档。 第一种,米联客的DCP封装包 第二种,正点原子的源码工程 第三种,基于正点原子的赛灵思MAC核的代码工程。

    Red-Hat-Enterprise-Linux-7-RPM-Packaging-Guide-en-US

    Red_Hat_Enterprise_Linux-7-RPM_Packaging_Guide-en-US

    Matlab 三维人脸识别系统 V 4.3.zip

    Matlab 三维人脸识别系统 V 4.3.zip

    信捷XD PLC MODBUS控制阀岛通信 案例程序

    信捷XD PLC MODBUS控制阀岛通信 案例程序

    常用进制转换器16进制10进制2进制转换计算器..exe

    大家好呀!今天来介绍一款常用进制转换器,也就是 16 进制、10 进制、2 进制转换计算器。有了它,你可以轻松实现不同进制之间的快速转换。无论是将 16 进制转换为 10 进制或 2 进制,还是从其他进制转换过来,它都能准确而高效地完成。无论是在计算机编程、数字电路等领域,还是日常对进制转换有需求的时候,它都能成为你的得力小助手,让进制转换不再麻烦,快来试试吧!

    微信小程序:智能排队取号系统 - 地图组件集成

    这款微信小程序是一个创新的智能排队取号系统,专为提高服务行业的效率和顾客满意度而设计。它通过集成地图组件,为用户提供了一个直观、易用的排队和取号解决方案。用户可以在小程序中查看各个服务点的位置,实时了解排队情况,并进行远程取号。 小程序的主要功能包括: 实时排队信息:用户可以实时查看各个服务点的排队情况,包括当前排队人数、预计等待时间等。 远程取号:用户无需到现场即可通过小程序远程取号,节省了排队等待的时间。 地图导航:集成的地图组件可以帮助用户快速找到服务点的具体位置,并提供导航服务。 取号管理:用户可以在小程序中管理自己的取号信息,包括查看、取消等操作。 此外,小程序还支持多种场景,如餐饮、医疗、银行、政府服务等,适用于各种需要排队取号的服务场合。它不仅提高了服务效率,减少了顾客的等待时间,还为商家提供了客流管理和数据分析的工具。

    520节日520节日表白神器.zip

    520节日520节日表白神器520节日520节日表白神器520节日520节日表白神器520节日520节日表白神器

    JAVA语言考试系统的设计与实现(LW+源代码+文献综述+外文翻译+开题报告).zip

    JAVA语言考试系统的设计与实现(LW+源代码+文献综述+外文翻译+开题报告)

    相移法偏移MATLAB代码.zip

    相移法偏移MATLAB代码.zip

    directx修复工具directx修复工具directx修复工具.txt

    directx修复工具directx修复工具directx修复工具directx修复工具

    基于matlab的三维地球建模,需联网.zip

    基于matlab的三维地球建模,需联网.zip

    字符串处理-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

    字符串处理-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

    蓝桥杯-基础题C++: 其压缩包中为C++ code

    参加比赛的一些心得:感觉把比赛得那一门语言基础学会,输入输出([我写的python输入输出](https://blog.csdn.net/qq_41392228/article/details/123614298)),([C++的STL](https://blog.csdn.net/qq_41392228/article/details/124825895)),熟练里面的数据结构,如数组,map等,==主要还是基础==。熟悉了后,可以在刷一下基础题,巩固哈学了的基础知识。把基础学好了,拿个奖是没问题的,正常发挥即可。想那个好的名词,就要看看相关的算法了,主要就是暴力的+优化,BFS,DFS,比较难的就是动态规划,得找转换方程。 python版本的可见:https://blog.csdn.net/qq_41392228/article/details/123616441

    基于 Rust + eBPF 丢弃 GFW DNS 污染包

    基于 Rust + eBPF 丢弃 GFW DNS 污染包 GFW 污染 DNS 的方式为抢答,我们只需要丢弃投毒响应即可获得正确的解析结果。通过 eBPF 我们可以在内核中插入代码,相比在用户态启动代理,这样可以获得更好的性能。 要丢弃投毒响应,重点是找到它们的特征。 以 twitter.com 为例,当向 8.8.8.8 请求 twitter.com 的 A 记录时,正常的响应会返回 2 条结果(1Q2A);而 GFW 只会返回 1 条,但是使用了 2 次抢答。2 次抢答包其中一个 IP Identification = 0x0000,另一个 IP Flags = 0x40(Don't fragment);而正常的响应 IPID 不会是 0 并且 IP Flags = 0。 我们只要 Drop 掉符合对应特征的包即可。这时我们可以验证,twitter.com 可以正确解析(fb 等非 google 服务也正常)。

Global site tag (gtag.js) - Google Analytics