c3po mysql_c3po简单了解

package com.hanchao.test;

import java.lang.reflect.Field;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Scanner;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.DataSources;

/***********************

* @author:han

* @version:1.0

* @created:2015-10-11

***********************

*/

public class TestPool {

public static void main(String[] args) {

/*Scanner input = new Scanner(System.in);

System.out.println("请输入账号:");

String name = input.next();

System.out.println("请输入密码:");

String pwd = input.next();

System.out.println("请输入金额:");

float money = input.nextFloat();*/

final String DRIVER = "com.mysql.jdbc.Driver";

//final String URL = "jdbc:mysql://127.0.0.1:3306/mydb";

//final String URL = "jdbc:mysql://localhost:3306/mydb";

final String URL = "jdbc:mysql:///mydb";

final String NAME = "root";

final String PASSWORD = "root";

Connection conn = null;

Statement stat = null;

ResultSet rs = null;

try {

//1.加载数据库驱动

Class.forName(DRIVER);

//连接mysql数据库

DataSource unpooled = DataSources.unpooledDataSource(URL,NAME,PASSWORD);

//构建一个连接池

DataSource pooled = DataSources.pooledDataSource(unpooled);

//2.获取数据库连接(first Time)

conn = pooled.getConnection();

System.out.println("1 con Class Type is :" + conn.getClass().getName());

//取得内部的实际数据库连接

Object o1 = getInner(conn);

System.out.println("1 Inner con Class Type is :" + o1.getClass().getName());

//3.获取Statement对象

stat = conn.createStatement();

//4.执行SQL

rs = stat.executeQuery(" select * from t_user where id = 13");

while (rs.next()) {

System.out.println(" username:" + rs.getString("username"));

}

//5.关闭连接

rs.close();

stat.close();

conn.close();

//6.等待连接返回池中

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

//第二次获取数据库连接

conn = pooled.getConnection();

System.out.println("2 con Class Type is :" + conn.getClass().getName());

Object o2 = getInner(conn);

System.out.println("2 Inner con Class Type is :" + o2.getClass().getName());

//获取Statement对象

stat = conn.createStatement();

//3.获取Statement对象

stat = conn.createStatement();

//4.执行SQL

rs = stat.executeQuery(" select * from t_user where id = 13");

while (rs.next()) {

System.out.println(" username:" + rs.getString("username"));

}

/*

//3.获取Statement对象

//String sql = "delete from t_user where id = 13";

//String sql = "insert into t_user(username,address) values('tom1','USA1')";

StringBuilder sql = new StringBuilder();

sql.append("INSERT INTO t_account(username,`password`,money,`enable`)  ");

sql.append("VALUES ");

sql.append("('"+name+"','"+pwd+"','"+money+"','1')");

System.out.println("SQL:" + sql.toString());

//执行SQL

//int rows = stat.executeUpdate(sql);

int rows = stat.executeUpdate(sql.toString());

if (rows > 0) {

System.out.println("execute OK!!");

} else {

System.out.println("execute error !!");

}

*/

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

if (stat != null) {

stat.close();

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

if (conn != null) {

conn.close();

}

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

private static Object getInner(Object conn) {

Object object = null;

Field f ;

try {

f = conn.getClass().getDeclaredField("inner");

f.setAccessible(true);

object = f.get(conn);

f.setAccessible(false);

} catch (Exception e) {

e.printStackTrace();

}

return object;

}

}

结果:

7e2834e43a07c38ed0f2fa616c31a0b7.png

fc4a08d4d6f6e6d3dce9187f3e37785b.png

首先,从数据库连接池获得一个连接。发现连接类型并不是mysql的数据库连接,而是,com.mchange.v2.c3p0.impl.NewProxyConnection。通过类名,可以推测,从数据库连接池中获取的只是一个代理。

当我们关闭.NewProxyConnection连接时,并没有真正关闭连接,而只是将数据库连接放入连接池保存,使得数据库连接在连接池中得到复用。而从连接池返回的NewProxyConnection对象,只是对真实数据库连接的包装。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值