2

我最近在玩基于 Java 的 Web 应用程序。这是一个我很长一段时间都想不通的障碍。希望有人能给一些提示。

就我而言,我使用了两个 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(); 
}

障碍在于第四道工序。对于资源注入,其名称需要常量字符串,例如@Resource(name="myDB1"). 然而,权衡是它可能会使程序根本不动态。我的查询将是如何在 java 中设置和获取最终字符串,或者是否有任何其他可能的解决方案来实现我的目标?

来自 Eclipse 的错误消息是“注释属性 Resource.name 的值必须是常量表达式”。

4

2 回答 2

0

按照zvzdhk在他的建议中提到的,我已经成功实现了运行时动态数据库选择。下面的代码是我的实现细节:

Connection conn = null; 
Context ctx = new InitialContext();
DataSource ds = (DatSource)ctx.lookup("java:com/env"+userInput.getDB());

if(ds != null)
{
    conn = ds.getConnection();
}

注意:请记住在 WebContent/META-INF/context.xml 或 tomcat/config/context.xml 下设置数据源池。同时将jdbc驱动jar文件复制到tomcat/lib/文件夹下。如果您使用的是 MySQL,它将是 mysql-connector-java.jar。而如果您使用的是 IBM DB2,它将是 db2jcc.jar、db2jcc4.jar 和 db2jcc_license_cu.jar。

希望这个答案可以帮助其他人。这是我找到的最好的资源,请随意看看。它不仅有利于项目,也有利于你自己。使用 Java Web 应用程序选择最佳数据库连接

于 2013-02-06T09:35:10.840 回答
0

对于动态数据源,使用 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>

然后在你的控制器中:

@Resource(name="jdbc/myDS")
private DataSource myDS;

public void doSomething() {
  Connection conn = myDS.getConnection();
  ...
}

然后由应用程序服务器在其配置中定义数据源(通常通过控制台),将数据库配置与您的应用程序完全分离,并且通常免费为您提供连接池。

于 2013-02-01T08:10:18.947 回答