我应该在应用程序或应用程序服务器中定义数据源吗?

时间:2015-08-12 11:33:16

标签: java jboss datasource

我已经开发了两个不同团队的应用程序(在Jboss服务器上运行)。一个团队在应用程序WAR文件中有数据源配置,另一个团队在应用程序服务器的standalone.xml中有它。而且我不确定哪种方法更好。

因此,我在定义服务器独立文件夹内的数据源时发现了一些优点。

  • 在服务器的standalone.xml中定义数据源比在war文件中更安全。如果数据库连接凭证存储在服务器的standalone.xml中(几乎从未修改过),则比使用war文件中的密码更安全,war文件通常从开发人员的机器传输到服务器和数据库配置由所有开发人员计算机传播。
  • 通过在standalone.xml中使用datasource,我们可以使war文件更小,因为JDBC驱动程序可以作为模块安装,并且可以从war文件中删除。此外,从类路径加载JDBC作为模块更有效。
  • 如果我们不希望应用程序开发团队知道数据库连接设置,我们可以将数据源放在standalone.xml中。

通过在应用程序WAR文件中使用数据源配置,我看到了以下优点:

  • 开发团队没有权限在运行Jboss的环境中更改Jboss配置文件。因此,只能在应用程序中定义数据库连接。
  • 当开发人员经常需要在不同的数据库连接之间切换时,它在开发状态下很有用。例如,开发人员可以在构建WAR文件时指定连接。

所以我想知道这两种方法是否还有其他优点。你认为哪种方法更好?

4 个答案:

答案 0 :(得分:4)

除了问题中提到的要点之外,在应用程序之外使用数据源的另一个好处是它允许在不同区域使用相同的war文件。这将允许团队在使用相同的war文件时为不同的环境(如Test,Perf和Prod)提供不同的数据库。

您可以进行一次部署,然后您的QA团队测试过的war文件可以升级到生产区域。这样可以确保没有未经测试的代码进入更高的区域,同时避免了SCM分支和代码冻结的需要。

答案 1 :(得分:1)

我赞成让应用服务器公开数据源并提出警告。 您需要您的开发团队至少了解应用程序服务器的方法,或至少访问jboss控制台以查看配置或更改它。 原因是例如他们需要监视数据源连接池的连接使用情况。由于您正在谈论jboss,我不知道" live"使用jboss AS的数据源的bean公开了本地相同的信息,例如oracle ucp(ucp .getStatistics是一个godSend,原因不止一个......)。

考虑一下即使你在xml中内化数据源,使用配置文件的概念你可以使xml的某些字段被填充"基于应用程序加载的配置文件在一个或另一个属性文件中具有某些特定值..

例如春天你一定可以做到

    <beans profile="local">
    <bean id="dataSource" class="oracle.ucp.jdbc.PoolDataSourceFactory" factory-method="getPoolDataSource">
        <property name="URL" value="jdbc:oracle:thin:@db00-ccea.labucs.int:1521:CCEA"/>
        <property name="user" value="myuser_DCI"/>
        <property name="password" value="mypassword_DCI"/>
        <property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleConnectionPoolDataSource"/>
        <property name="connectionPoolName" value="${name.connection.pool}"/>
        <property name="minPoolSize" value="5"/>
        <property name="maxPoolSize" value="1000"/>
        <property name="maxIdleTime" value="3000"/>
        <property name="maxStatements" value="3000"/>
        <property name="validateConnectionOnBorrow" value="true" />
        <property name="inactiveConnectionTimeout" value="3000" />
        <property name="connectionWaitTimeout" value="3000"/>
        <property name="abandonedConnectionTimeout" value="3000"/>
        <qualifier value ="dataSourceDCI" />
    </bean>
    <orcl:pooling-datasource id="dataAltSource"
        url="jdbc:oracle:thin:@db00-ccea.labucs.int:1521:CCEA" username="some_OWN" password="some_OWN"/>
        <util:properties id="flyway.prop" location="classpath:config_local.properties"/>
</beans>

意味着在本地配置文件中加载类路径中的config_loca.properties文件中的属性

并且还有

    <beans profile="qa">
    <bean id="dataSource" class="oracle.ucp.jdbc.PoolDataSourceFactory" factory-method="getPoolDataSource">
        <property name="URL" value="jdbc:oracle:thin:@db00-ccea.labucs.int:1521:CCEA"/>
        <property name="user" value="myuserQA_DCI"/>
        <property name="password" value="myuserQA_DCI"/>
        <property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleConnectionPoolDataSource"/>
        <property name="connectionPoolName" value="${name.connection.pool}"/>
        <property name="minPoolSize" value="5"/>
        <property name="maxPoolSize" value="1000"/>
        <property name="maxIdleTime" value="3000"/>
        <property name="maxStatements" value="3000"/>
        <property name="validateConnectionOnBorrow" value="true" />
        <property name="inactiveConnectionTimeout" value="3000" />
        <property name="connectionWaitTimeout" value="3000"/>
        <property name="abandonedConnectionTimeout" value="3000"/>
        <qualifier value ="dataSourceDCI" />
    </bean>
    <bean id="dataAltSource" class="oracle.ucp.jdbc.PoolDataSourceFactory" factory-method="getPoolDataSource">
        <property name="URL" value="jdbc:oracle:thin:@db00-ccea.labucs.int:1521:CCEA"/>
        <property name="user" value="myuserQA_OWN"/>
        <property name="password" value="myuserQA_OWN"/>
        <property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleConnectionPoolDataSource"/>
        <property name="connectionPoolName" value="${name.connection.pool}"/>
        <property name="minPoolSize" value="5"/>
        <property name="maxPoolSize" value="1000"/>
        <property name="maxIdleTime" value="3000"/>
        <property name="maxStatements" value="3000"/>
        <property name="validateConnectionOnBorrow" value="true" />
        <property name="inactiveConnectionTimeout" value="3000" />
        <property name="connectionWaitTimeout" value="3000"/>
        <property name="abandonedConnectionTimeout" value="3000"/>
    </bean>     
    <util:properties id="flyway.prop" location="file:///${prefix.iam.dir}/${filecert.iam.path}/external.properties"/>
</beans>

因此,在您的QA环境或其他非开发环境中,您可以参考外部xml文件而不是战争中集成的文件。 你甚至可以包括用户名和密码来填充&#34;通过内部//外部属性文件,以增强您的安全性。

答案 2 :(得分:1)

为了正确验证您的应用程序是否有效,您应该在将其发送到生产环境之前尝试使用临时服务器。

在这种情况下,您安装到生产环境中的war文件应该与您测试的相同,因此您不需要为应用程序更改任何内容以在具有不同数据库连接的不同环境中工作。

因此,数据库配置不应该在war文件中,而应该在应用程序服务器中。此外,您可以让系统管理员更轻松,因为他们不需要操纵(解压缩和更改)您的战争以将其安装在服务器中。

在应用程序的早期开发过程中,添加数据库(以及任何其他开发配置)以减少开发人员将他/她的手放在项目上并开始编程而无需配置的时间非常有用。应用程序在开发应用程序服务器中。

答案 3 :(得分:1)

对我来说,将所有数据源配置排除在war文件之外的第一个好处是易于部署。

如果我正确地阅读了您的问题,那么无法将完全相同的构建部署到多个环境中(如果您在构建中包含任何配置)。直接暗示您永远不能将DEV构建部署到QA,更重要的是,您无法将QA构建部署到PROD或UAT。如果您的流程经过审核,这可能会让您头疼。

如果我误解了你的问题,请告诉我,否则,我希望这会有所帮助。