zoukankan      html  css  js  c++  java
  • 使用DBUtils小框架

    DBUtils对sqlserver好像支持不怎么好,经常出现问题

    比如

    三月 14, 2015 10:19:32 上午 com.mchange.v2.log.MLog 
    信息: MLog clients using java 1.4+ standard logging.
    三月 14, 2015 10:19:32 上午 com.mchange.v2.c3p0.C3P0Registry 
    信息: Initializing c3p0-0.9.5 [built 02-January-2015 13:25:04 -0500; debug? true; trace: 10]
    三月 14, 2015 10:19:32 上午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource 
    信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 5, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> sqlserver, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.microsoft.sqlserver.jdbc.SQLServerDriver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceUseNamedDriverClass -> false, identityToken -> 2vnjwi9864jlrl1j21iiv|7609e871, idleConnectionTestPeriod -> 0, initialPoolSize -> 10, jdbcUrl -> jdbc:sqlserver://localhost:1433;database=test, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 20, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 5, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
    java.sql.SQLException: com.microsoft.sqlserver.jdbc.SQLServerException: '?' 附近有语法错误。 Query: insert into teacher values(?,?,?) Parameters: [c325abd1-4298-49bf-be9f-2e5b670b2e48, huahua, 1000]
    	at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:392)
    	at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:491)
    	at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:457)
    	at com.liujie.dao.TeacherDao.addTeacher(TeacherDao.java:22)
    	at com.liujie.service.TeacherService.addTeacher(TeacherService.java:11)
    	at com.liujie.test.TeacherTest.testTeacher(TeacherTest.java:35)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    	at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
    

     幸亏这是开源框架,还可以修改底层代码,但改了万一mysql又不能用了怎么办?所以就不了了之,

    最佳组合推荐:mysql+c3p0+dbutils

    c3p0的配置有这些:

    <c3p0-config>

    <default-config>

     

    <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->

    <property name="acquireIncrement">3</property>

     

    <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->

    <property name="acquireRetryAttempts">30</property>

     

    <!--两次连接中间隔时间,单位毫秒。Default: 1000 -->

    <property name="acquireRetryDelay">1000</property>

     

    <!--连接关闭时默认将所有未提交的操作回滚。Default: false -->

    <property name="autoCommitOnClose">false</property>

     

    <!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么

    属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试

    使用。Default: null-->

    <property name="automaticTestTable">Test</property>

     

    <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效

    保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试

    获取连接失败后该数据源将申明已断开并永久关闭。Default: false-->

    <property name="breakAfterAcquireFailure">false</property>

     

    <!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出

    SQLException,如设为0则无限期等待。单位毫秒。Default: 0 -->

    <property name="checkoutTimeout">100</property>

     

    <!--通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。

    Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester-->

    <property name="connectionTesterClassName"></property>

     

    <!--指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可

    Default: null-->

    <property name="factoryClassLocation">null</property>

     

    <!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs.

    (文档原文)作者强烈建议不使用的一个属性-->

    <property name="forceIgnoreUnresolvedTransactions">false</property>

     

    <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->

    <property name="idleConnectionTestPeriod">60</property>

     

    <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->

    <property name="initialPoolSize">3</property>

     

    <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->

    <property name="maxIdleTime">60</property>

     

    <!--连接池中保留的最大连接数。Default: 15 -->

    <property name="maxPoolSize">15</property>

     

    <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements

    属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。

    如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->

    <property name="maxStatements">100</property>

     

    <!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->

    <property name="maxStatementsPerConnection"></property>

     

    <!--c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能

    通过多线程实现多个操作同时被执行。Default: 3-->

    <property name="numHelperThreads">3</property>

     

    <!--当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0

    的数据源时。Default: null-->

    <property name="overrideDefaultUser">root</property>

     

    <!--与overrideDefaultUser参数对应使用的一个参数。Default: null-->

    <property name="overrideDefaultPassword">password</property>

     

    <!--密码。Default: null-->

    <property name="password"></property>

     

    <!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:

    测试的表必须在初始数据源的时候就存在。Default: null-->

    <property name="preferredTestQuery">select id from test where id=1</property>

     

    <!--用户修改系统配置参数执行前最多等待300秒。Default: 300 -->

    <property name="propertyCycle">300</property>

     

    <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的

    时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable

    等方法来提升连接测试的性能。Default: false -->

    <property name="testConnectionOnCheckout">false</property>

     

    <!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false -->

    <property name="testConnectionOnCheckin">true</property>

     

    <!--用户名。Default: null-->

    <property name="user">root</property>

    在Hibernate(spring管理)中的配置:

     

     

     

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

    <property name="driverClass"><value>oracle.jdbc.driver.OracleDriver</value></property>

    <property name="jdbcUrl"><value>jdbc:oracle:thin:@localhost:1521:Test</value></property>

    <property name="user"><value>Kay</value></property>

    <property name="password"><value>root</value></property>

    <!--连接池中保留的最小连接数。-->

    <property name="minPoolSize" value="10" />

    <!--连接池中保留的最大连接数。Default: 15 -->

    <property name="maxPoolSize" value="100" />

    <!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->

    <property name="maxIdleTime" value="1800" />

    <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->

    <property name="acquireIncrement" value="3" />

    <property name="maxStatements" value="1000" />

    <property name="initialPoolSize" value="10" />

    <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->

    <property name="idleConnectionTestPeriod" value="60" />

    <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->

    <property name="acquireRetryAttempts" value="30" />

    <property name="breakAfterAcquireFailure" value="true" />

    <property name="testConnectionOnCheckout" value="false" />

    </bean>

     支持事务的JDBCUtils

     1 public class JDBCUtils {
     2     static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
     3     private static ComboPooledDataSource cpds = null;
     4     static {
     5         cpds = new ComboPooledDataSource("sqlserver");
     6     }
     7 
     8     public static DataSource getDataSource() {
     9         return cpds;
    10     }
    11 
    12     public static Connection getConnection() throws SQLException {
    13         Connection conn = tl.get();
    14 
    15         if (conn == null) {
    16             conn = cpds.getConnection();
    17             tl.set(conn);
    18         }
    19 
    20         return conn;
    21     }
    22 
    23     public static void startTransaction() throws SQLException {
    24         Connection conn = tl.get();
    25 
    26         if (conn == null) {
    27             conn = getConnection();
    28             tl.set(conn);
    29         }
    30         conn.setAutoCommit(false);
    31     }
    32 
    33     public static void rollback() throws SQLException {
    34         Connection conn = tl.get();
    35         if (conn != null) {
    36             conn.rollback();
    37         }
    38     }
    39 
    40     public static void commit() throws SQLException {
    41         Connection conn = tl.get();
    42         if (conn != null) {
    43             conn.commit();
    44         }
    45     }
    46 
    47     public static void release() throws SQLException {
    48         Connection conn = tl.get();
    49         if (conn != null) {
    50             conn.close();
    51             tl.remove();
    52         }
    53     }
    54 
    55 }
  • 相关阅读:
    基于perl的网络爬虫
    ios cell展示可滑动的图片
    iOS计算字符串的宽度高度
    swift水波效果
    iOS添加另一个控制器的时候要注意啊
    swift隐藏显示导航栏的底线
    swift集成alamofire的简单封装
    tableview详细介绍
    xmpp xml基本语义
    xmpp SASL 定义
  • 原文地址:https://www.cnblogs.com/liujie037/p/4337103.html
Copyright © 2011-2022 走看看