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

时间:2013-02-01 07:34:31

标签: java

我最近正在玩基于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的值必须是常量表达式”。

2 个答案:

答案 0 :(得分: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();
  ...
}

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

答案 1 :(得分: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下设置databsources池。同时,将jdbc驱动器jar文件复制到tomcat / lib /文件夹。如果您使用的是MySQL,那将是mysql-connector-java.jar。如果您使用的是IBM DB2,那么它将是db2jcc.jar,db2jcc4.jar和db2jcc_license_cu.jar。

希望这个答案可以帮助别人。这是我找到的最好的资源,请随时查看。它不仅有益于项目,也有利于您自己。 Choose best Database Connectivity with Java web application