java - 在基于 Java 的 Web 应用程序中为数据库动态分配资源

标签 java

我最近在玩基于 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/

相关文章:

java - java中线程之间的通信: stopping a thread if another thread has finished

Java-WebSocket - 从服务器获取客户端证书进行身份验证

java - 在 Java 中导入单个类

java - 如何将新模型传递到 Spring WebFlow2 中的 View 状态

java - 为什么子类中的 super.getClass() 返回子类名称

java - 树集示例

java - 如何从 JBoss 5.x 下的 JavaEE 应用程序获取类加载器 ObjectName

java - 如何将可观察列表转换为数组列表? java

java - 使用 JOGL 加载 .obj

java - java中的模拟