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