2014-11-05 91 views
2

免責聲明:當我的代碼在家中另一臺PC上時,我可能在今天晚上無法訪問到這個問題。我現在正在寫這個問題,而我記憶猶新,所以對於任何錯誤都表示歉意。Tomcat 7/Tomee/Java Datasource

問題:我正在寫一個連接到MySQL數據庫的Tomee的web應用程序。我已經成功地創建了Tomee一個數據源,如下圖所示:

<Resource auth="Container" 
      driverClassName="com.mysql.jdbc.Driver" 
      maxActive="100" 
      maxIdle="30" 
      maxWait="10000" 
      name="jdbc/TestDB" 
      type="javax.sql.DataSource" 
      url="jdbc:mysql://localhost:3306/java" 
      username="u5ser" 
      password="p4ssword"/> 

這工作得很好,但不依賴此數據源中的任何配置/我在部署我的代碼的Tomcat/Tomee的所有實例最終我我希望能夠在Glassfish或Weblogic或其他Tomcat's/Tomee的其他容器中部署此代碼。 AKA我希望數據源出現在War文件中。

記住這一點,有沒有一種方法可以在Java中編寫我自己的數據源(MyDataSource.class),並將其捆綁到WAR文件中並使用WebListener對其進行初始化。

本質上:我想知道如何將XML編碼到我自己的DataSource中(即使這不是推薦的方式 - 我只是在試驗)。

此外,一個考慮因素是我想編寫代碼以便我可以從屬性文件中讀取數據,並使數據源的各個方面可配置。

我在Web上發現了幾個例子,但它是maxActive,maxIdle,maxWait位,所以我可以在代碼中創建連接池。這些似乎不見了。

任何幫助表示讚賞。

回答

1

您可以在您的WAR Apache Commons DBCPApache Commons Pool創建自己的數據源:

package com.company.app.util; 

import java.sql.Connection; 
import java.sql.SQLException; 
import javax.sql.DataSource; 
import org.apache.commons.dbcp.BasicDataSource; 

public final class ConnectionProvider { 
    private static final DataSource DATA_SOURCE; 
    static { 
     try { 
      BasicDataSource dataSource = new BasicDataSource(); 
      dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
      dataSource.setUrl("jdbc:mysql://localhost/test"); 
      dataSource.setUsername("root"); 
      dataSource.setPassword(""); 
      dataSource.setValidationQuery("select now()"); 
      dataSource.setTestOnBorrow(true); 
      dataSource.setRemoveAbandoned(true); 
      DATA_SOURCE = dataSource; 
     } catch (Throwable t) { 
      throw new ExceptionInInitializerError(t); 
     } 
    } 
    public static Connection getConnection() throws SQLException { 
     return DATA_SOURCE.getConnection(); 
    } 
} 

如果你想使用一個屬性文件,請參閱Reading Properties file in Java並在上面的代碼替換性能

+0

我喜歡這個我以後會給這個(或者只要我可以在家裏的電腦上) – thonnor 2014-11-05 16:15:04

+0

我會接受這個作爲最好的答案,因爲它工作到一個點,是我的東西可以在另一個項目中使用,諷刺呃?然而,這已經提出了另一個問題 - 我將在這裏使用SO,Google和通常的嫌疑人之前研究這個問題。謝謝您的幫助。 – thonnor 2014-11-06 09:24:22

1

您可以在Java中使用MySQL使用JDBC DriverManager接口。

您需要導入

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 

try { 
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java?user=u5ser&password=p4ssword"); 
} catch (SQLException ex) { 
    // handle any errors 
    System.out.println("SQLException Message: " + ex.getMessage()); 
    System.out.println("SQLState: " + ex.getSQLState()); 
} 

正如你說,這是實驗性的:-)你可以做到這一點。

+0

很好的答案。這會允許連接池嗎? – thonnor 2014-11-05 16:12:08

0

你看@DataSourceDefinition或其xml等效(在web.xml中)?

+0

我沒有害怕。我最終嘗試了一些東西,並且使用定義的數據源來創建META-INF/context.xml。它工作正常(反正在tomcat上)。我需要重新思考Weblogic/Glassfish,但這還有一段路要走。 – thonnor 2014-11-11 19:56:18