为什么需要数据源? 主要是方便管理 。正式的数据库和应用服务器应该是单独的人员管理,而不是开发人员;密码会定期修改 ,如果链接数据库是各自书写代码和配置,则运行环境的密码修改将会是一个噩梦,一不小心就忘记一个 。所以,大家全部到一个数据源那里获取连接。管理员只需要修改数据源的配置,而无需修改应用的配置
在配置项中,我们使用数据源来表示对应的数据库连接。使用数据源有两个好处:对开发人员屏蔽数据库细节,只要通过JNDI取得数据源就可以了,无需关心数据库连接是如何建立的;数据源通常都提供了数据库连接池的功能。
数据库连接是一种关键的有限的昂贵的资源,而且数据库连接的建立和关闭也是很耗费系统资源的。在传统的两层C/S架构中,一个客户端对应一个数据库连接,在用户活动期间就独占此连接;而在分布式系统中,数据库连接的建立与关闭是异常频繁的,因此数据库连接的对系统的性能影响更是明显。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
对于6.0的tomcat,打开%TOMCAT_HOME%\conf\context.xml,添加以下配置:
<Resource name="jdbc/mysql"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"
username="root"
password="root"
maxActive="20"
maxIdle="10"
maxWait="-1"/>
以上是针对mysql数据库进行的配置 ,配置后,重启服务器, 另外也可以在service.xml中进行配置:
修改server.xml文件在<Service>中写入以下代码:
<Context path="/WebProject" docBase="WebProject" reloadable="true" crossContext="true">
<Resource auth="Container" name="jdbc/CompanyDB" type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;DataBaseName=Company"
username="sa"
password="root"
maxActive="100"
maxIdle="30"
maxWait="10000"
removeAbandoned=“true”
removeAbandonedTimeOut="10"
logAbandoned="true"/>
</Context>
path:工程路径。
docBase:工程名字。
name:JNDI的名字。
type:数据源的类。
factory:指定生成的DataReource的factory类名;默认DBCP工厂类。
driverClassName:数据库驱动名。
url:数据库连接的URL。
username:数据库用户名。
password:数据库密码。
maxActive:最大连接数据库数,设为0表示没有限制。
maxIdle:最大等待数量,设为0表示没有限制。
maxWait:最大等待秒数,单位为ms。
removeAbandoned:是否自我中断,默认为false。
removeAbandonedTimeOut:几秒后会自我中断,removeAbandoned必须为true。
logAbandoned:是否记录中断事件,默认为false。
在web.xml中配置
<resource-ref>
<description>MYSQLConnection Pool</description>
<res-ref-name>jdbc/mysql</res-ref-name><!--对应上面的数据源名称-->
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth> <!--对应上面的auth类型-->
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
spring数据源配置对应于下面配置:通过JNDI 查找对应的数据源
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/mysql"/>
</bean>
Context ctx = new InitalContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/CompanyDB");
Connection conn = ds.getConnection();
注意:java:comp/env/ 是java中JNDI固定写法。