วิธีการใช้ JNDI DataSource ของ Tomcat ใน Spring


159

ว่ากันว่าในบทความ Spring javadoc เกี่ยวกับDriverManagerDataSourceคลาสนั้นคลาสนี้ง่ายมากและแนะนำ

เพื่อใช้ JNDI DataSource ที่จัดทำโดยคอนเทนเนอร์ a DataSourceสามารถถูกเปิดเผยเป็นDataSourcebean ใน Spring ApplicationContext ผ่านJndiObjectFactoryBean

คำถามคือฉันจะทำสิ่งนี้ได้อย่างไร

ตัวอย่างเช่นถ้าฉันต้องการให้DataSourcebean เข้าถึงฐานข้อมูล MySQL ที่กำหนดเองฉันจะต้องใช้อะไร ฉันควรเขียนอะไรในการกำหนดค่าบริบท ฯลฯ

คำตอบ:


302

หากใช้การกำหนดค่า XML สกีมาของ Spring ให้ตั้งค่าในบริบท Spring ดังนี้:

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">
...
<jee:jndi-lookup id="dbDataSource"
   jndi-name="jdbc/DatabaseName"
   expected-type="javax.sql.DataSource" />

หรือตั้งค่าโดยใช้การกำหนดค่าถั่วอย่างง่ายเช่นนี้:

<bean id="DatabaseName" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/DatabaseName"/>
</bean>

คุณสามารถประกาศทรัพยากร JNDI ใน server.xml ของ tomcat โดยใช้สิ่งนี้:

<GlobalNamingResources>
    <Resource name="jdbc/DatabaseName"
              auth="Container"
              type="javax.sql.DataSource"
              username="dbUser"
              password="dbPassword"
              url="jdbc:postgresql://localhost/dbname"
              driverClassName="org.postgresql.Driver"
              initialSize="20"
              maxWaitMillis="15000"
              maxTotal="75"
              maxIdle="20"
              maxAge="7200000"
              testOnBorrow="true"
              validationQuery="select 1"
              />
</GlobalNamingResources>

และอ้างอิงทรัพยากร JNDI จากเว็บบริบทของ Tomcat เช่นนี้:

  <ResourceLink name="jdbc/DatabaseName"
   global="jdbc/DatabaseName"
   type="javax.sql.DataSource"/>

เอกสารอ้างอิง:

แก้ไข: คำตอบนี้ได้รับการปรับปรุงสำหรับ Tomcat 8 และ Spring 4 มีการเปลี่ยนแปลงชื่อคุณสมบัติบางอย่างสำหรับการตั้งค่าพูลทรัพยากรแหล่งข้อมูลเริ่มต้นของ Tomcat


@skaffman ใช่ แต่คุณให้ลิงค์ไปยังเอกสารอ้างอิงของ Spring
Etienne Miret

คุณหมายถึงไฟล์อะไรโดย "เว็บบริบทของ Tomcat"
Pavel Niedoba

1
@PavelNiedoba Tomcat ใช้ "บริบท" สำหรับการกำหนดค่าเว็บแอปเฉพาะของ Tomcat ไฟล์บริบทและ / หรือการกำหนดค่าบริบทสามารถวางในตำแหน่งต่างๆดังนั้นฉันไม่สามารถให้คำตอบที่ชัดเจนได้ ตำแหน่งทั่วไปคือ "/META-INF/context.xml" ดูที่หัวข้อ "การกำหนดบริบท" ที่นี่: tomcat.apache.org/tomcat-8.0-doc/config/ …
kaliatech

อืม ... ดูเหมือนจะไม่ทำงานกับ oracle db ของฉันความแตกต่างกับ postgresql หรือไม่?
Phate

1
@Phate ไม่มีความแตกต่างพื้นฐานกับ Oracle vs PostgreSQL ที่ระดับ JDBC / JNDI / Tomcat อย่างไรก็ตาม Oracle แตกต่างจาก PostgreSQL มากเมื่อพูดถึงรายละเอียดการตั้งค่าไคลเอนต์ / เซิร์ฟเวอร์ของ Oracle อยู่นอกขอบเขตของคำถาม / คำตอบดั้งเดิม แนะนำการโพสต์คำถามใหม่พร้อมรายละเอียดเกี่ยวกับสิ่งที่คุณลองรุ่นที่เฉพาะเจาะจงและข้อความแสดงข้อผิดพลาด ตัวอย่าง: stackoverflow.com/questions/10388137/…
kaliatech

52

ด้วยกลไก JavaConfig ของ Spring คุณสามารถทำได้ดังนี้

@Configuration
public class MainConfig {

    ...

    @Bean
    DataSource dataSource() {
        DataSource dataSource = null;
        JndiTemplate jndi = new JndiTemplate();
        try {
            dataSource = jndi.lookup("java:comp/env/jdbc/yourname", DataSource.class);
        } catch (NamingException e) {
            logger.error("NamingException for java:comp/env/jdbc/yourname", e);
        }
        return dataSource;
    }

}


21

สมมติว่าคุณมีคำนิยามแหล่งข้อมูล "sampleDS" ในการกำหนดค่า Tomcat ของคุณคุณสามารถเพิ่มบรรทัดต่อไปนี้applicationContext.xmlเพื่อเข้าถึงแหล่งข้อมูลโดยใช้ JNDI

<jee:jndi-lookup expected-type="javax.sql.DataSource" id="springBeanIdForSampleDS" jndi-name="sampleDS"/>

คุณต้องกำหนดเนมสเปซและตำแหน่งสคีมาสำหรับjeeคำนำหน้าโดยใช้:

xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"

15

เอกสารประกอบ: C.2.3.1 <jee:jndi-lookup/>(ง่าย)

ตัวอย่าง:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource"/>

คุณเพียงแค่ต้องค้นหาสิ่งที่ JNDI ชื่อ appserver ของคุณได้ผูกไว้กับแหล่งข้อมูล นี่คือเฉพาะเซิร์ฟเวอร์ทั้งหมดศึกษาเอกสารบนเซิร์ฟเวอร์ของคุณเพื่อค้นหาวิธี

จำไว้ว่าให้ประกาศjeenamespace ที่ด้านบนของไฟล์ถั่วของคุณตามที่อธิบายไว้ในC.2.3 jee สคี


8

คุณสมบัติอื่น: แทนที่จะเป็น server.xml คุณสามารถเพิ่มแท็ก "ทรัพยากร" ใน
your_application / META-INF / Context.xml (ตามเอกสาร Tomcat ) ดังนี้:

<Context>
<Resource name="jdbc/DatabaseName" auth="Container" type="javax.sql.DataSource"
  username="dbUsername" password="dbPasswd"
  url="jdbc:postgresql://localhost/dbname"
  driverClassName="org.postgresql.Driver"
  initialSize="5" maxWait="5000"
  maxActive="120" maxIdle="5"
  validationQuery="select 1"
  poolPreparedStatements="true"/>
</Context>


4

ในชั้นเรียนฤดูใบไม้ผลิของคุณคุณสามารถฉีดถั่วใส่คำอธิบายประกอบเช่น

@Autowired
@Qualifier("dbDataSource")
private DataSource dataSource;

และคุณเพิ่มสิ่งนี้ใน context.xml ของคุณ

<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/>
</beans:bean>

คุณสามารถประกาศทรัพยากร JNDI ใน server.xml ของ tomcat โดยใช้

<Resource name="jdbc/TestDB" 
  global="jdbc/TestDB" 
  auth="Container" 
  type="javax.sql.DataSource" 
  driverClassName="com.mysql.jdbc.Driver" 
  url="jdbc:mysql://localhost:3306/TestDB" 
  username="pankaj" 
  password="pankaj123" 

  maxActive="100" 
  maxIdle="20" 
  minIdle="5" 
  maxWait="10000"/>

กลับไปที่ context.xml เพิ่มในฤดูใบไม้ผลินี้

<ResourceLink name="jdbc/MyLocalDB"
                global="jdbc/TestDB"
                auth="Container"
                type="javax.sql.DataSource" />

ถ้าเช่น exmple นี้คุณกำลังเชื่อมต่อกับฐานข้อมูลตรวจสอบให้แน่ใจว่ามีขวด MySQL อยู่ในไดเรกทอรี Tomcat lib มิฉะนั้น Tomcat จะไม่สามารถสร้างพูลการเชื่อมต่อฐานข้อมูล MySQL ได้


1

ฉันพบว่าโซลูชันนี้มีประโยชน์อย่างมากในการลบการกำหนดค่า xml ทั้งหมด

โปรดตรวจสอบการกำหนดค่าฐานข้อมูลนี้โดยใช้ JNDI และเฟรมเวิร์กสปริง http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/

โดยบทความนี้จะอธิบายวิธีการสร้างการประสานฐานข้อมูลที่ง่ายขึ้นอยู่กับการกำหนดค่าฐานข้อมูล jndi (db / test) เมื่อคุณเสร็จสิ้นการกำหนดค่าจากนั้นที่เก็บ db ทั้งหมดจะถูกโหลดโดยใช้ jndi นี้ ฉันพบว่ามีประโยชน์ หาก @Pierre มีปัญหากับสิ่งนี้โปรดแจ้งให้เราทราบ เป็นโซลูชั่นที่สมบูรณ์ในการเขียนการกำหนดค่า db


โดยบทความนี้จะอธิบายวิธีการสร้างการประสานฐานข้อมูลที่ง่ายขึ้นอยู่กับการกำหนดค่าฐานข้อมูล jndi (db / test) เมื่อคุณเสร็จสิ้นการกำหนดค่าจากนั้นที่เก็บ db ทั้งหมดจะถูกโหลดโดยใช้ jndi นี้ ฉันพบว่ามีประโยชน์ หาก @Pierre มีปัญหากับสิ่งนี้โปรดแจ้งให้เราทราบ เป็นโซลูชั่นที่สมบูรณ์ในการเขียนการกำหนดค่า db
3892286

โดยบทความนี้จะอธิบายวิธีการสร้างการประสานฐานข้อมูลที่ง่ายขึ้นอยู่กับการกำหนดค่าฐานข้อมูล jndi (db / test) เมื่อคุณเสร็จสิ้นการกำหนดค่าจากนั้นที่เก็บ db ทั้งหมดจะถูกโหลดโดยใช้ jndi นี้ ฉันพบว่ามีประโยชน์ หาก @Pierre มีปัญหากับสิ่งนี้โปรดแจ้งให้เราทราบ เป็นโซลูชั่นที่สมบูรณ์ในการเขียนการกำหนดค่า db
Sergio A.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.