-
Java使用C3P0数据库连接池的方法
2018-01-24 15:52:10这样的操作在一般情况下是没什么问题的,但是如果出现频繁的操作就会造成一些性能上的问题,因为频繁打开关闭连接是个耗时的操作,所以就Java目前用得最多的是C3P0实现JDBC连接池,由于刚入手Java希望各位小伙伴海涵...JAVA基础之利用C3P0实现JDBC连接池,提高数据库处理的能力,加快性能。一般情况下,操作数据库的过程都是连接数据库->执行操作->释放资源。这样的操作在一般情况下是没什么问题的,但是如果出现频繁的操作就会造成一些性能上的问题,因为频繁打开关闭连接是个耗时的操作,所以就Java目前用得最多的是C3P0实现JDBC连接池,由于刚入手Java希望各位小伙伴海涵。
使用C3P0先得引包:c3p0-0.9.1.2.jar和mysql-connector-java-5.1.39-bin.jar
编写C3P0配置文件c3p0-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test20180109</property> <property name="user">root</property> <property name="password">root</property> <property name="initialPoolSize">5</property> <property name="maxPoolSize">20</property> </default-config> <named-config name="lfriend"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql:///test20180109</property> <property name="user">root</property> <property name="password">root</property> </named-config> </c3p0-config>
编写c3p0工具类
package me.lfriend.jdbc.utils; import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; public class C3P0Utils { private static ComboPooledDataSource dataSource=new ComboPooledDataSource('lfriend'); public static DataSource getDataSource(){ return dataSource; } public static Connection getConnection(){ try { return dataSource.getConnection(); } catch (SQLException e) { throw new RuntimeException(e); } } }
编写测试类TestC3P0.java
package me.lfriend.jdbc.test; import com.mchange.v2.c3p0.ComboPooledDataSource; import me.lfriend.jdbc.utils.C3P0Utils; import me.lfriend.jdbc.utils.JDBCUtils_V3; import org.junit.Test; import java.sql.Connection; import java.sql.PreparedStatement; public class TestC3P0 { @Test public void testAddUser(){ Connection conn=null; PreparedStatement pstmp=null; //1.创建自定义连接池对象 ComboPooledDataSource dataSource=new ComboPooledDataSource();//加载默认配置 //ComboPooledDataSource dataSource=new ComboPooledDataSource("lfriend");//加载有名称的配置 try { //2.从池子中获取连接 conn=dataSource.getConnection(); //3.编写sql String sql="insert into user values(null,?,?)"; //4.创建预处理对象 pstmp=conn.prepareStatement(sql); //5.设置参数 pstmp.setString(1,"piu"); pstmp.setString(2,"123456"); //6.执行查询 int row=pstmp.executeUpdate(); if(row>0){ System.out.println("添加成功!"); }else{ System.out.println("添加失败!"); } }catch (Exception e){ throw new RuntimeException(e); }finally { JDBCUtils_V3.release(conn,pstmp,null); } } /** * 工具类使用C3P0 */ @Test public void testAddUser1(){ Connection conn=null; PreparedStatement pstmp=null; try { conn= C3P0Utils.getConnection(); //3.编写sql String sql="insert into user values(null,?,?)"; //4.创建预处理对象 pstmp=conn.prepareStatement(sql); //5.设置参数 pstmp.setString(1,"piu"); pstmp.setString(2,"123456"); //6.执行查询 int row=pstmp.executeUpdate(); if(row>0){ System.out.println("添加成功!"); }else{ System.out.println("添加失败!"); } }catch (Exception e){ throw new RuntimeException(e); }finally { JDBCUtils_V3.release(conn,pstmp,null); } } }
C3P0的基本操作就是这样,欢迎各位大佬指出问题!
-
java c3p0 连接 mysql_Java使用C3P0数据库连接池的方法
2021-01-19 01:44:37这样的操作在一般情况下是没什么问题的,但是如果出现频繁的操作就会造成一些性能上的问题,因为频繁打开关闭连接是个耗时的操作,所以就Java目前用得最多的是C3P0实现JDBC连接池,由于刚入手Jav...因不想继续在PHP花更多的时间,所以入手JAVA,从零学至此利用C3P0实现JDBC连接池,提高数据库处理的能力,加快性能。一般情况下,操作数据库的过程都是连接数据库->执行操作->释放资源。这样的操作在一般情况下是没什么问题的,但是如果出现频繁的操作就会造成一些性能上的问题,因为频繁打开关闭连接是个耗时的操作,所以就Java目前用得最多的是C3P0实现JDBC连接池,由于刚入手Java希望各位小伙伴海涵。
使用C3P0先得引包:c3p0-0.9.1.2.jar和mysql-connector-java-5.1.39-bin.jar
编写C3P0配置文件c3p0-config.xml<?xml version="1.0" encoding="UTF-8" ?> com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/test20180109 root root 5 20 com.mysql.jdbc.Driver jdbc:mysql:///test20180109 root root
编写c3p0工具类package me.lfriend.jdbc.utils;import com.mchange.v2.c3p0.ComboPooledDataSource;import javax.sql.DataSource;import java.sql.Connection;import java.sql.SQLException;public class C3P0Utils { private static ComboPooledDataSource dataSource=new ComboPooledDataSource('lfriend'); public static DataSource getDataSource(){ return dataSource; } public static Connection getConnection(){ try { return dataSource.getConnection(); } catch (SQLException e) { throw new RuntimeException(e); } }}
编写测试类TestC3P0.javapackage me.lfriend.jdbc.test;import com.mchange.v2.c3p0.ComboPooledDataSource;import me.lfriend.jdbc.utils.C3P0Utils;import me.lfriend.jdbc.utils.JDBCUtils_V3;import org.junit.Test;import java.sql.Connection;import java.sql.PreparedStatement;public class TestC3P0 { @Test public void testAddUser(){ Connection conn=null; PreparedStatement pstmp=null; //1.创建自定义连接池对象 ComboPooledDataSource dataSource=new ComboPooledDataSource();//加载默认配置 //ComboPooledDataSource dataSource=new ComboPooledDataSource("lfriend");//加载有名称的配置 try { //2.从池子中获取连接 conn=dataSource.getConnection(); //3.编写sql String sql="insert into user values(null,?,?)"; //4.创建预处理对象 pstmp=conn.prepareStatement(sql); //5.设置参数 pstmp.setString(1,"piu"); pstmp.setString(2,"123456"); //6.执行查询 int row=pstmp.executeUpdate(); if(row>0){ System.out.println("添加成功!"); }else{ System.out.println("添加失败!"); } }catch (Exception e){ throw new RuntimeException(e); }finally { JDBCUtils_V3.release(conn,pstmp,null); } } /** * 工具类使用C3P0 */ @Test public void testAddUser1(){ Connection conn=null; PreparedStatement pstmp=null; try { conn= C3P0Utils.getConnection(); //3.编写sql String sql="insert into user values(null,?,?)"; //4.创建预处理对象 pstmp=conn.prepareStatement(sql); //5.设置参数 pstmp.setString(1,"piu"); pstmp.setString(2,"123456"); //6.执行查询 int row=pstmp.executeUpdate(); if(row>0){ System.out.println("添加成功!"); }else{ System.out.println("添加失败!"); } }catch (Exception e){ throw new RuntimeException(e); }finally { JDBCUtils_V3.release(conn,pstmp,null); } }}
C3P0的基本操作就是这样,欢迎各位大佬指出问题!
-
SqlDataReader的合适关闭方法
2010-12-20 21:11:00这两天在对照几个典型的.net网站的时候,发现了一个小小的问题,大家在对数据库操作的时候经常会用到SqlDataReader,这个方法在调用完之后是要及时关闭的,问题就是什么时候关闭是合适的? 为了这个...这两天在对照几个典型的.net网站的时候,发现了一个小小的问题,大家在对数据库操作的时候经常会用到SqlDataReader,这个方法在调用完之后是要及时关闭的,问题就是什么时候关闭是合适的?
为了这个问题我专门上微软的官方论坛找了点东西,我在这里和我平时用的稍微的对比了一下
我们平时用方法一般是(至少我以前看到的是的,特别是很多.net书籍上):
/// <summary>
/// 常见的获取SqlDataReader方法
/// 通常的数据访问层都会提供这个方法
/// </summary>
static SqlDataReader GetReader()
{
//通过连接字符串获取连接
SqlConnection con = new SqlConnection(conn_String);
try
{
//打开连接,执行查询
//并且返回SqlDataReader
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = Sql;
SqlDataReader dr = cmd.ExecuteReader();
return dr;
}
finally
{
//这里的代码就是问题所在
//如果这里执行关闭:con.Close();
//那返回的SqlDataReader将毫无用处,因为其
//依赖的连接已经关闭
//如果这里不执行con.Close();那返回后该连接将永远无法关闭,因为调用方无法
//得到连接对象
}
}我在微软的官方实例petshop中看的方法却是:
static SqlDataReader GetReader_CloseConnection(SqlConnection con)
{
try
{
//打开连接,执行查询
//并且返回SqlDataReader
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = Sql;
SqlDataReader dr = cmd.ExecuteReader
(CommandBehavior.CloseConnection);
return dr;
}
finally
{
//不需要使用con.Close();
}
}我找了找CommandBehavior.CloseConnection的作用
CommandBehavior.CloseConnection的功能恰好就是为了避免类似的尴尬境地,它能够保证当SqlDataReader对象被关闭时,其依赖的连接也会被自动关闭。
只需要在使用DataReader对象之后的时候,将DataReader对象关闭即可,这样conn就自己关闭了。找了个小例子:
/// <summary>
/// 测试方法
/// </summary>
static void Main(string[] args)
{
//建立连接
SqlConnection con = new SqlConnection(conn_String);
try
{
//测试使用了CommandBehavior.CloseConnection的方法
Console.WriteLine("测试使用了CommandBehavior.
CloseConnection的方法:");
SqlDataReader sdr = GetReader_CloseConnection(con);
while (sdr.Read()) { }
sdr.Close();
Console.WriteLine("读取完毕后的连接状态:" + con.State.ToString());
//测试没有使用CommandBehavior.CloseConnection的方法
Console.WriteLine("测试没有使用CommandBehavior.
CloseConnection的方法:");
SqlDataReader sdr1 = GetReader_NoCloseConnection(con);
while (sdr1.Read()) { }
sdr1.Close();
Console.WriteLine("读取完毕后的连接状态:" +
con.State.ToString());
Console.Read();
}
finally
{
//确保连接被关闭
if (con.State != ConnectionState.Closed)
con.Close();
}
}读取完毕后的连接状态:Closed
测试没有使用CommandBehavior.CloseConnection的方法:
读取完毕后的连接状态:Open
正如读者所看到的,使用了CommandBehavior.CloseConnection得到的SqlDataReader对象,在关闭的同时会自动地关闭其依赖的数据库连接对象,这个特性解决了数据访问层编写中的困境。
-
SqlDataReader的合适关闭方法?
2012-09-05 16:20:002011年5月22日 这两天在对照几个典型的.net网站的时候,发现了一个小小的问题,大家在对数据库操作的时候经常会用到SqlDataReader,这个方法在调用完之后是要及时关闭的,问题就是什么时候关闭是合适的? 为了这个...2011年5月22日 这两天在对照几个典型的.net网站的时候,发现了一个小小的问题,大家在对数据库操作的时候经常会用到SqlDataReader,这个方法在调用完之后是要及时关闭的,问题就是什么时候关闭是合适的?
为了这个问题我专门上微软的官方论坛找了点东西,我在这里和我平时用的稍微的对比了一下
我们平时用方法一般是(至少我以前看到的是的,特别是很多.net书籍上):
/// <summary>
/// 常见的获取SqlDataReader方法
/// 通常的数据访问层都会提供这个方法
/// </summary>
static SqlDataReader GetReader()
{
//通过连接字符串获取连接
SqlConnection con = new SqlConnection(conn_String);
try
{
//打开连接,执行查询
//并且返回SqlDataReader
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = Sql;
SqlDataReader dr = cmd.ExecuteReader();
return dr;
}
finally
{
//这里的代码就是问题所在
//如果这里执行关闭:
con.Close();
//那返回的SqlDataReader将毫无用处,因为其
//依赖的连接已经关闭
//如果这里不执行con.Close();那返回后该连接将永远无法关闭,因为调用方无法
//得到连接对象
}
}我在微软的官方实例petshop中看的方法却是:
static SqlDataReader GetReader_CloseConnection(SqlConnection con)
{
try
{
//打开连接,执行查询
//并且返回SqlDataReader
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = Sql;
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
finally
{
//不需要使用con.Close();
}
}我找了找CommandBehavior.CloseConnection的作用
CommandBehavior.CloseConnection的功能恰好就是为了避免类似的尴尬境地,它能够保证当SqlDataReader对象被关闭时,其依赖的连接也会被自动关闭。
只需要在使用DataReader对象之后的时候,将DataReader对象关闭即可,这样conn就自己关闭了。找了个小例子:
/// <summary>
/// 测试方法
/// </summary>
static void Main(string[] args)
{
//建立连接
SqlConnection con = new SqlConnection(conn_String);
try
{
//测试使用了CommandBehavior.CloseConnection的方法
Console.WriteLine("测试使用了CommandBehavior.CloseConnection的方法:");
SqlDataReader sdr = GetReader_CloseConnection(con);
while (sdr.Read()) { }
sdr.Close();
Console.WriteLine("读取完毕后的连接状态:" + con.State.ToString());
//测试没有使用CommandBehavior.CloseConnection的方法
Console.WriteLine("测试没有使用CommandBehavior.CloseConnection的方法:");
SqlDataReader sdr1 = GetReader_NoCloseConnection(con);
while (sdr1.Read()) { }
sdr1.Close();
Console.WriteLine("读取完毕后的连接状态:" +
con.State.ToString());
Console.Read();
}
finally
{
//确保连接被关闭
if (con.State != ConnectionState.Closed)
con.Close();
}
}读取完毕后的连接状态:Closed
测试没有使用CommandBehavior.CloseConnection的方法:
读取完毕后的连接状态:Open
正如读者所看到的,使用了CommandBehavior.CloseConnection得到的SqlDataReader对象,在关闭的同时会自动地关闭其依赖的数据库连接对象,这个特性解决了数据访问层编写中的困境。
转自:http://hi.baidu.com/516%D0%A1%C5%DA/blog/item/30a79ede7738d51962279808.html
我是指针,却丢失了目标地址! 我是循环,却缺少了结束条件! 我是函数,却没有人来调用!
-
MYSQL网络数据库PDF学习资源
2009-08-09 19:56:312.3.4 希望对值进行什么样的比较 87 2.3.5 计划对列进行索引吗 87 2.3.6 列类型选择问题的相互关联程度 88 2.4 表达式求值和类型转换 88 2.4.1 撰写表达式 89 2.4.2 类型转换 94 第3章 MySQL SQL 语法及其用法 99 ... -
Oracle Database 11g数据库管理艺术--详细书签版
2012-09-30 01:09:45书中内容主要集中在大多数企业常见的问题之上,如安装和升级到oracle database 11g数据库软件、创建数据库、导出和导入数据、数据库的备份与恢复、性能调优,等等。 本书还提供了dba完成本职工作必备的基本的uniix... -
深入浅出MySQL数据库开发、优化与管理维护
2014-01-21 15:48:0118.1 优化SQL语句的一般步骤 18.1.1 通过showstatus命令了解各种SQL的执行频率 18.1.2 定位执行效率较低的SQL语句 18.1.3 通过EXPLAIN分析低效SQL的执行计划 18.1.4 确定问题并采取相应的... -
关于数程序链接数据库的问题,向老手请教一下
2016-02-01 19:28:19测试的时候发现如果数据库没有启动或中途关关闭的话,程序会直接卡死或退出,本人的想法是每次连接数据库的时候用try catch之类的语句测试一下,不让程序卡死影响其它的功能,但是这样好像比较费性能,由于没有参与... -
请教Spring + Hibernate进行开发时,session关闭问题
2008-11-07 09:58:34用到了hibernate+spring的话,一般我们直接用getHibernateTemplate().find("from User")这类型的查询。 单是现在我项目里面程序用到这个类型的: Session s = super.getSession(); ... -
Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好
2011-01-28 17:02:08所以只有用第一种方法,将该语句也放到if 语句中,而在else 语句中用else return 0; ,这样如果enterBtn 没有被按下,那么程序就会结 束执行了。 到这里,我们就实现了一个界面结束执行,然后弹出另一个 界面的程序... -
Java设计模式(3)--代理模式
2016-12-20 20:13:43就比如,数据库连接池的应用,一般老说,我们用完数据库连接,将会调用close()方法,将该连接关闭,但是在连接池中,应该是将数据库连接归还给连接池,而不是直接关闭,以达到统一管理的目的,这就需要我们去代理... -
接口的意义(转)
2019-07-09 01:19:56接口的作用简单一点就是:接口是用来标记类的,...问题:现在我们要写个连接数据库的类给用户使用,有两个函数:一个返回Connection对象,另一个是关闭数据库,close(),一般的解决方法是:给每个数据库写一个类,再根据用... -
接口的作用
2009-09-11 16:53:00接口的作用简单一点就是:接口... 使用接口解决问题 问题:现在我们要写个连接数据库的类给用户使用,有两个函数:一个返回Connection对象,另一个是关闭数据库,close(),一般的解决方法是:给每个数据库写一个类,再根据用 -
java接口的作用
2008-11-29 13:08:29接口的作用简单一点就是:接口是用来标记类...问题:现在我们要写个连接数据库的类给用户使用,有两个函数:一个返回Connection对象,另一个是关闭数据库,close(),一般的解决方法是:给每个数据库写一个类,再根据用... -
java基础:关于final关键字
2017-06-01 15:35:59final 关键字首先,我们先来区分一下,final finally关键字与finalize()方法之间的区别。他们三者唯一的相同点就是都是...所以一般关于各种流、数据库连接的关闭还有lock的unlock操作都写在该代码块中。 finalize -
面试的时候被问到的几个问题,求解
2010-11-01 14:37:34面试官:那有什么方法可以防止用户修改cookie? 我:加密吧... 面试官:怎么弄? 我:我说 把信息变成字符串,然后加密下,到服务器上再解密 面试官:那不是还没解决这个问题? 我想了想 ,最后说不... -
2.1.5 堆栈溢出一般是由什么原因导致的? 2.1.6 什么函数不能声明为虚函数? 2.1.7 冒泡排序算法的时间复杂度是什么? 2.1.8 写出float x 与“零值”比较的if语句 2.1.9 Internet采用哪种网络协议?该协议的主要...
-
spring 的事物配置
2010-01-12 19:39:11顺便提下,是不是加入事物管理了dao层方法中的数据库连接就不会关闭。因为我开始一个查询blob属性,查询没加入事物时,会报链接关闭的异常,安照网上说法,加入事物就好了。 [b]问题补充:[/b] 数据库连接池当然... -
玩转模板--自动代码生成工程
2013-01-28 23:40:31如果各位想用其他数据库,可以自己加载其他数据库的驱动,并修改一下DbOption类下的getTableColumns(String)方法中的查询表信息方法 以及添加类似dm2java.properties数据库类型到java数据类型的映射文件,不同数据库... -
Python基础教程 第二版
2018-04-04 12:35:589.2.1 重写一般方法和特殊的构造方法 9.2.2 调用未绑定的超类构造方法 9.2.3 使用super、函数 9.3 成员访问 9.3.1 基本的序列和映射规则 9.3.2 子类化列表,字典和字符串 9.4 更多魔力 9.5 属性 9.5.1 property函数 ... -
net学习笔记及其他代码应用
2010-11-16 18:15:0911.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? 答:一般为3层 数据访问层,业务层,表示层。 数据访问层对数据库进行增删查改。 业务层一般分为二层,业务表观层... -
ORACLE9i_优化设计与系统调整
2010-01-16 16:22:01§12.3.6 一般的SQL语句优化 143 §12.4 SQL语句优化技巧 144 §12.4.1 对所有SQL语句执行EXPLAIN_PLAN 145 §12.4.2 磁盘读和缓冲区获取 146 §12.4.3 判定式崩溃 146 §12.5 使用EXISTS和IN 148 §12.6 分离事务... -
jdbc基础和参考
2014-01-08 13:04:17线程安全的,一个数据库对应一个Sessionfactory(一般一个应用程序对应一个SessionFactory就够了) 3.是一个很大的缓存,本身维护了一个可配置的二级缓存 4.用来构建Session对象 Configuration 1.启动和配置... -
做了一个小时的面试题(没有过 希望大家帮忙答下 虽然很幼稚 毕竟每个人都是这么过来的吗 感激了!...
2010-04-16 11:10:582、 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是()。 A、 可行性分析 B、需求分析 C、详细设计 D、程序编码 我的答案:B 3、 结构化程序设计主要强调的是()。 A、 程序的规模 B、... -
MySQL命令大全
2018-01-15 11:19:17mysqldump -u 用名 -p –default-character-set=latin1 数据库名 > 导出的文件名(数据库默认编码是latin1) mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql 2.导出一个表 mysqldump -u 用户名 -p 数据库名 表名... -
超级有影响力霸气的Java面试题大全文档
2012-07-18 09:47:04finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 16、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)... -
亮剑.NET深入体验与实战精要2
2013-04-02 16:05:2415.5.2 及时地关闭数据库连接 563 15.5.3 跟踪监视SQL Server当前链接池状态 564 15.5.4 善用数据库的存储过程 567 15.5.5 SqlDataRead和Dataset的选择 567 15.5.6 ExecuteNonQuery和 ExecuteScalar的选择 568 15.5....