一、数据源概念说明
企业级应用一般要使用数据库,而使用数据库,现在直接使用JDBC来获取数据库连接已经很少了,因为获取连接消耗的性能比较高。一般做法都是提供带有连接池功能的数据源,数据源中保存一部分数据库的长连接,用户需要访问数据库的时候,从数据源中获取一个数据库连接操作就可以了。使用完后"关闭"数据库连接,连接返回到连接池中(这里的关闭并没有真正关闭掉数据库的底层连接,而是将占用的数据库连接释放掉,返回到连接池中共其他程序使用)。
普元产品中所说的数据源有三个层次的数据源:
1、应用服务器数据源
应用服务器数据源就是应用服务器层面提供的数据源。配置这些数据源,一般可以通过应用服务器的管理控制台进行配置,或直接修改数据源配置文件(如JBoss、Tomcat等)。
2、应用数据源
这种数据源是在普元产品开发的应用中配置的数据源,这个数据源是通过Governor进行配置的,数据源的配置对应的文件是user-config.xml文件里面的datasource部分。
应用数据源分为两类,见下表:
数据源类型 |
适合应用服务器 |
数据源的本质 |
---|---|---|
C3P0数据源 |
Tomcat |
自己管理数据库连接池,不需要应用服务器的数据源。 |
JNDI数据源 |
JBoss、WebLogic、WebSphere、PAS |
只是一个对应用服务器数据源的应用,数据源名称对应 |
应用数据源的名称默认为default,下面是两个数据源的配置例子:
1)C3P0数据源配置:
|
2)JNDI数据源的配置:
|
3、构件包数据源
构件包中定义的数据源。使用普元产品开发数据库应用,一般多用逻辑流,使用基础构件库中的数据库基础构件来访问数据库,里面填写的第一个参数就是构件包数据源的名称,如下图所示:
构件包数据源是一个对应用数据源的引用,一般默认配置一个数据源,默认名称为"default",对应默认的应用数据源"default"。构件包通常配置一个数据源,如果使用多个数据源,可以配置两个应用数据源,再配置两个构件包数据源。构件包数据源在构件包META-INF/contribution.eosinf中配置,下面是配置了两个数据源的例子:
|
其中,ds1和ds2是构件包数据源的名称,appDS1、appDS2是应用数据源的名称(这个例子没有使用默认的default名称)。
应用服务器数据源、应用数据源和构件包数据的关系如下图所示:
二、多数据源的配置
在大多数应用开发的情况下,一般使用的是单数据源,在安装介质安装开发版或运行版时,都是选择一个单一数据源的。但随着用户业务的复杂程度的提高,可能需要连接多个数据库的时候,需要配置多个数据源。
配置和使用多数据源,主要有以下几个步骤:
1、配置多个应用服务器数据源,通过应用服务器控制台配置,或修改数据源配置文件。
2、配置多个应用数据源,配置多个数据源(C3P0或JNDI),可以通过Governor进行配置,不同的数据源名字起为不同的。可以参考《我要配置数据源或更改数据库》。应用数据源配置在user-config.xml中。
3、配置构件包数据源,在构件包配置文件中,增加多个构件包数据源选项,每个选项对应一个应用数据源的名称。程序使用数据源是通过数据库访问构件通过构件包数据源访问数据库的,因此要配置构件包数据源。
修改构件包的数据源,要在Studio的EOS项目中,修改配置的contribution.eosinf文件的数据源部分,如下所示:
|
上面显示了构件包使用了两个数据源,一个名字是default的默认构件包数据源,关联名字为default的应用数据源,另一个是名称为ds2构件包数据源,关联了名字为secondDS的应用数据源。
三、使用多数据源
1、通过基础构件库使用多数据源。
程序在使用数据源的时候,一般调用平台提供的数据库访问构件库来访问数据库,如下图所示的逻辑流,第一个参数就是构件包数据源的名称,使用ds2构件包数据源,从而能够使用第二个数据源。使用更多的数据源的原理相同。
使用这种数据源配置的好处是,程序可以预先定好使用几个数据源,并写死程序,但只写一个关联的名称,上线的时候,通过更改应用数据源来更改相应的数据库连接,而不需要再修改程序-,达到灵活配置数据源的目的。
建议一个事务中只操作同一个数据源,不建议一个事务中操作不同的数据源。
如果要想在一个事务中使用不同的数据源,就要更换数据库的驱动类,使用支持JTA的XA数据库驱动程序,XA的驱动目前存在问题较多,不是很稳定,因此尽量不用。
2、使用SpringBean构件来使用多数据源。
除了逻辑流使用多数据源外,用SpringBean也可以使用多个数据源。要通过SpringBean使用多数据源,需要首先更改应用级的Spring配置文件,增加数据源的Bean。
1)配置数据源和事务管理器Bean
修改EOS项目中的"系统配置-config-user"节点下的spring.xml配置文件,修改数据源的配置,如下:
|
这里面配置了两个数据源的Bean,名字分别为DefaultDataSource和datasource2,对应的应用数据源的名称分别为default和secondAppDS。
再为数据源配置一个事务管理器,如下;
|
这里配置了两个事务管理器,DefaultTransactionMananger和TransactionManager2,用的是同一种事务管理器实现,对应的数据源bean分别是DefaultDataSource和datasource2。
2) 增加使用数据库的SpringBean(DAO)
在构件包中新建SpringBean,扩展com.eos.spring.DASDaoSupport类。修改构件包的配置文件"配置--spring"的beans.xml文件,如下:
|
上面是配置了两个SpringBean,分别使用了不同的数据源。
SpringBean的开发具体可以参考联机帮助文档中的《EOS帮助文档-入门学习入门指南-SpringBean开发》部分的文档说明。
3、ConnectionHelper底层API
可以直接使用普元产品提供的底仓API来获取数据库连接,普元提供了下面的接口来获取数据库连接:
com.eos.common.connection. ConnectionHelper类的两个接口:
1)根据应用数据源名称获取数据库连接:public static Connection getConnection(String dataSourceName)。
2)根据构件包名称和构件包数据源名称来获取数据库连接:public static Connection getContributionConnection(String contributionName,String dataSourceAlias)。
注:第一个参数是构件包名称,第二个参数为构件包数据源名称。
使用底层获取数据库连接,要手工写编程式事务,如事务开始, 事务提交和事务回滚,用完后要手工关闭数据库。否则数据库操作会出现问题,如不能保证数据操作的一致性,或数据库连接不释放等bug。