我最近在玩基于 java 的网络应用程序。这是我长时间无法弄清楚的障碍。希望有人可以给一些提示。
在我的例子中,我使用了两个 xml 文件进行预配置。一个是数据库资源的详细信息,包括 URL、用户名、密码等,另一个是稍后为 DOM 提供的简单选择选项。我想使用xml文件进行预配置的目的是让我的程序尽可能动态化。因此,任何更新我的数据库之一,我可以只更改两个 xml 文件而不是源代码。
为了实现这一点,我需要根据用户的选择动态分配数据库资源。我个人的想法是通过 Controller 或 Servlet 类中的以下过程来实现此目标:
// get user's selected option from request, create Input object
String userSelection = request.getParameter("title");
Input userInput = new Input(userSelection);
// open user selection options xml inside Input class
Document doc = dBuilder.parse(xmlFile);
// get matched option and set database name inside Input class
if(userSelectoin.equals(doc.getElementByTagName("desiredTitle"))
{
userInput.setDB(doc.getElementByTagName("dbname");
}
// use resource injection to get all details of corresponding database in database xml
@Resource(name=userInput.getDB())
public void doConnection()
{
DataSource myDB;
Connection myConn = myDB.getConnection();
}
障碍在于第四道工序。对于资源注入(inject),其名称需要常量字符串,例如@Resource(name="myDB1")
。然而,权衡是它可能使程序根本不是动态的。我的问题是如何在 Java 中设置和获取最终字符串,或者是否有任何其他可能的解决方案来实现我的目标?
来自 Eclipse 的错误消息是“注释属性 Resource.name 的值必须是常量表达式”。
最佳答案
对于动态数据源,使用 jndi 资源会更好:
在 web.xml 中定义数据源
<resource-ref>
<description>My DataSource</description>
<res-ref-name>jdbc/myDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
然后在你的 Controller 中:
@Resource(name="jdbc/myDS")
private DataSource myDS;
public void doSomething() {
Connection conn = myDS.getConnection();
...
}
然后由应用服务器在其配置中定义数据源(通常通过控制台),将数据库配置与您的应用完全分离,并且通常免费提供连接池。
关于java - 在基于 Java 的 Web 应用程序中为数据库动态分配资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14641668/