我正在尝试将我的项目部署到 AWS Elastic Beanstalk,使用 Docker 和预配置的 Glassfish。
由于该项目使用 JPA 和 EJB 来创建事务持久性单元;我在 Glassfish 管理控制台中创建了一个数据库连接池,然后将 JNDI 字符串提供给 persistence.xml
。
在我的本地机器中一切都很好,亚马逊不允许您使用管理控制台。我已经阅读了这篇文章,其中讨论了如何使用asadmin
配置Glassfish,但我发现它很难遵循并且听起来非常具有侵略性。
是否有一种通用的解决方案来创建在我部署应用程序的任何服务器上自动分配的数据库连接池?
是的。尽管不幸的是,这记录不足。
您可以创建一个应用程序范围的连接池,当您将战争文件分解为应用程序范围的连接池时,Glassfish 会动态创建该连接池。它在未部署时会销毁它。但是,它仅适用于服务器上的此应用程序。
这是你应该做的。 创建一个名为glassfish-resources.xml
的文件,如下所示(适用于 MySql):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
<jdbc-connection-pool datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" name="MySQLPool" res-type="javax.sql.DataSource">
<property name="user" value="someUser"></property>
<property name="password" value="aPassword"></property>
<property name="databaseName" value="aDatabase"></property>
<property name="serverName" value="some.string.you got.from.amazon.rds.amazonaws.com"></property>
<property name="portNumber" value="3306"></property>
</jdbc-connection-pool>
<jdbc-resource pool-name="MySQLPool" jndi-name="jdbc/MySQLPool"></jdbc-resource>
</resources>
并将其放入您的WEB-INF
目录中。还应将数据库连接依赖项 jar 放在 lib
目录中。
现在,由于这不是全局 JNDI 引用,因为它仅适用于此应用程序,因此您应该使用 java:app
前缀在persistence.xml
中访问它,如下所示:
<jta-data-source>java:app/jdbc/MySQLPool</jta-data-source>