Java连接数据库方法概述
JDBC连接池、监控组件: Druid
Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。
Druid是一个JDBC组件,它包括三个部分:
- 基于Filter-Chain模式的插件体系。
- DruidDataSource 高效可管理的数据库连接池。
- SQLParser
Druid可以做什么?
- 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
- 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
- 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
- SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
- 扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。
-
DBCP更换为Druid.
- 之前项目中数据库连接池用的为DBCP,现在更换为Druid配置也非常方便:
-
从DBCP迁移到DruidDataSource,只需要修改数据源的实现类就可以了。
DBCP的数据库连接池的实现是:
org.apache.commons.dbcp.BasicDataSource
替换为:
com.alibaba.druid.pool.DruidDataSource
如果需要使用Druid的其他配置,可以参考http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=2916406
配置如下:
-
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property> <property value="${jdbc_user}" name="username"></property>
<property> <property value="stat" name="filters"></property>
<property> <property value="1" name="initialSize"></property>
<property> <property value="1" name="minIdle"></property>
<property> <property value="300000" name="minEvictableIdleTimeMillis"></property>
<property> <property value="true" name="testWhileIdle"></property>
<property> <property value="false" name="testOnReturn"></property>
<property> <property value="20" name="maxPoolPreparedStatementPerConnectionSize"></property>
</bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="${jdbc_url}" /> <property name="username" value="${jdbc_user}" /> <property name="password" value="${jdbc_password}" /> <property name="filters" value="stat" /> <property name="maxActive" value="20" /> <property name="initialSize" value="1" /> <property name="maxWait" value="60000" /> <property name="minIdle" value="1" /> <property name="timeBetweenEvictionRunsMillis" value="3000" /> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> </bean>
在上面的配置中,通常你需要配置url、username、password,maxActive这三项。
<bean id="dataSource-mysql" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="jdbc:mysql://192.168.1.100/druid-test" /> <property name="username" value="admin" /> <property name="password" value="adminpassword" /> <property name="initialSize" value="1" /> <property name="maxActive" value="20" /> </bean>
设计
这是DruidDataSource的设计图示:
http://code.alibabatech.com/svn/druid/trunk/doc/druid-pool.txt
如果发现有乱码,请选择utf-8的编码方式查看。Druid提供一个手工编写的高性能的方便扩展的SQL Parser。将会支持MySQL、Oracle等流行关系数据库的SQL Parser。
Parser组件包括如下几个部分:
- Lexer 词法解析
- Parser,Parser包括ExprParser,各种StatementParser。
- AST, Abstract Syntax Tree。ParserParse出来的结果就是AST。
- Visitor。对AST做各种处理,比如FormatOutput,遍历等等。
简介
Druid提供了强大的监控功能,能够监控连接池行为和SQL执行情况,让你能够详细了解应用的数据库访问行为。
监控对象
- Druid的统计信息定义代码实现在com/alibaba/druid/stat下。所有的Stat都全局静态变量的方式保存,这样做使得外部获取监控信息更容易。
- 获取Druid监控信息的入口是com.alibaba.druid.stat.JdbcStatManager
- Druid的监控统计信息都是通过StatFilter来实现的,如果你需要数据源进行监控,那你需要启用StatFilter
Subversion
http://code.alibabatech.com/svn/druid/trunk/
Download
Binary: http://code.alibabatech.com/mvn/releases/com/alibaba/druid/0.1.2/druid-0.1.2.jar Source: http://code.alibabatech.com/mvn/releases/com/alibaba/druid/0.1.2/druid-0.1.2-sources.jar
Maven
Alibaba Open Source Repository
<repositories> <repository> <id>alibaba-opensource</id> <name>alibaba-opensource</name> <url>http://code.alibabatech.com/mvn/releases/</url> <layout>default</layout> </repository> <repository> <id>alibaba-opensource-snapshot</id> <name>alibaba-opensource-snapshot</name> <url>http://code.alibabatech.com/mvn/snapshots/</url> <layout>default</layout> </repository> </repositories>
依赖配置
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>0.1.2</version> </dependency> </dependencies>