数据源的绑定方法
1、一种方法是在服务器的配置文件中配置数据源。
Resin中的配置
<database>
<jndi-name>jdbc/sqlserver</jndi-name>
<driver type="com.microsoft.jdbc.sqlserver.SQLServerDriver">
<url>jdbc:microsoft:sqlserver://202.207.152.212:1433;DatabaseName=nxtcbf-yc</url>
<user>sa</user>
<password>admin</password>
</driver>
</database>
<jndi-name>是配置的数据源在JNDI中的名字,可以使用Context.lookup(“java:com/env/jdbc/sqlserver”);来查找到。
<driver>用于配置驱动程序的类型。
<url>连接串,包括主机的ip地址、段口号等,分号后可以带参数,具体使用可以参考Microsoft SQL Server 2000 Driver for JDBC的帮助文档。
采用以上的方法对于服务器的配置不是太灵活,所以考虑采用第二种方法来动态配置连接池。
2、第二种是动态配置自定义的数据源绑定
这种方法虽然比内建的数据源绑定复杂,但是我们对于获取连接的方法有了全面的控制。而且,这样配置可以使我们很灵活的改变数据库连接信息,当我们要改变他们的时候只需修改少部分代码和配置文件。
我所制作的动态数据源绑定程序的继承关系如图E.1所示:
图E.1 SqlserverConfig类的继承关系
各个类的方法
Config类
void init(ServletContext sctx,String xmlFile)
初始化,从外部的Xml文件读取数据源配置,并把各个元素存储在一个Element对象中
String getElementText(Element parent,String name)
从Element对象中读取相关名字的值。
DataBaseSource类
void init(ServletContext sctx,String xmlFile)
初始化父类,并读取相关配置信息到内存中的特定变量。
DataSource getDataSource()
返回一个数据源对象。用于他的子类取得配置好的数据源,如果没有配置好数据源将会返回空值。
SqlserverConfig类
init(ServletContext sctx,String xmlFile)
初始化父类,并读取特定数据库的配置信息到特定内存变量。
有了数据源配置类,还需要配置web应用程序的部署描述符中给出配置文件的位置,和数据源在JNDI中绑定的名称。我用如下的配置来标示两者。
<context-param>
<param-name>DataSourceConfigXml</param-name>
<param-value>/xmls/DataSource-Config.xml</param-value>
</context-param>
<context-param>
<param-name>DataSourceConfig</param-name>
<param-value>admin.config.SqlserverConfig</param-value>
</context-param>
第一个部署描述符的value属性给出数据源配置文件的位置。
第二个给出数据源在JNDI中绑定的名称。
数据源配置文件的配置要和配置类中定义的几个全局常量的值相对应,DataSource-Config.xml的部分代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<DataSource>
<ServerName>FZ18</ServerName>
<NetAddress>127.0.0.1</NetAddress>
<ServerPort>1433</ServerPort>
<DatabaseName>pubs</DatabaseName>
<DatabaseUser>sa</DatabaseUser>
<DatabasePassword>admin</DatabasePassword>
<SelectMethod>cursor</SelectMethod>
</DataSource>
注意:
ServerName必须指定而且一定要和你的sqlserver实例的名字相匹配
<SelectMethod>默认是direct,有时候需要指定为cursor不然会出现错误。
要实现特定数据源的动态配置,还需要一个自动绑定他的监听器,我定义了一个ServletContextListener,在服务器启动的时候就能自动配置数据源了。
具体实现如下:
DataSourceConfig dscfg = (DataSourceConfig) cls.newInstance();
dscfg.init(sctx,sctx.getInitParameter("DataSourceConfigXml"));
InitialContext ctx = new InitialContext();
JNDI_NAME=sctx.getInitParameter("DataSourceConfig");
ctx.bind(JNDI_NAME,dscfg.getDataSource());
我们可以把绑定的名字放在ServletContext对象中,以便随时使用。