数据库连接池的实现技术上有什么难点吗?现在用h3的c3p0连接池,有时候会报deadlock啥的,现在也没彻底解决。我考虑自己按照一定策略把数据库连接cache一下就可以了吧?

解决方案 »

  1.   

    技术上没什么难点,记得:
    1。连接池需要守护进程或断线重连机制,保持连接有效(比如网线拨了,不用重启服务)
    2。需要提供一系列参数,最好通过配置文件可以配,提供一个,仅做参考:
    <category code="eip" type="db">
    <param name="eid" value="EIP"/>
    <param name="expire" value="60000"/>
    <param name="driver" value="org.postgresql.Driver"/>
    <param name="url" value="jdbc:postgresql://127.0.0.1/EnterInfoPortal?charSet=UTF8"/>
    <param name="uname" value="postgres"/>
    <param name="pass" value="postgres"/>
    <param name="sharemin" value="1"/>
    <param name="sharemax" value="2"/>
    <param name="standardmin" value="1"/>
    <param name="standardmax" value="2"/>
    <param name="stmax" value="20"/>
    <param name="psmax" value="20"/>
    <param name="csmax" value="20"/>
    </category>
    <category code="cartoon" type="db">
    <param name="eid" value="CARTOON"/>
    <param name="expire" value="60000"/>
    <param name="driver" value="oracle.jdbc.driver.OracleDriver"/>
    <param name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"/>
    <param name="uname" value="ctcm"/>
    <param name="pass" value="oracle"/>
    <param name="sharemin" value="1"/>
    <param name="sharemax" value="2"/>
    <param name="standardmin" value="1"/>
    <param name="standardmax" value="2"/>
    <param name="stmax" value="10"/>
    <param name="psmax" value="10"/>
    <param name="csmax" value="10"/>
    </category>
      

  2.   

    那个死锁是上个项目的问题,只是一些warning,c3p0会自动处理,并不影响使用。
    原因大概是mysql对非活动连接回收机制的设置问题,也有可能是代码里没有及时关闭连接。
    不过搞了很久也没有彻底搞定,现在这个问题并不紧急,只是通过这件事觉得用别人的东西有点郁闷,
    对它的细节不能完全把握,比如这个c3p0是在什么时候初始化连接的我也一直没搞明白。之前也用过朋友自己实现的连接池,就是不知道在实际场景中会不会遇到比较难缠的问题。看了上面大侠提供的信息,灰常有用,感谢!~