Showing posts with label data source. Show all posts
Showing posts with label data source. Show all posts

Thursday, June 18, 2015

Maven Jetty Run : menggunakan JNDI

Saya ingin memberikan sedikit tips tentang running webapp menggunakan jetty plugin di maven.
Berawal pada saat ingin running aplikasi web spring menggunakan mvn jetty:run.
Awalnya baik baik saja. kemudian muncul masalah ketika source code di repository jdbc connection ke MySQL diganti menggunakan JNDI yg dipasang di jetty server.

 <jee:jndi-lookup id="dataSource"  
            jndi-name="jdbc/SampleDB"  
            expected-type="javax.sql.DataSource" />  
  <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">  
     <property name="persistenceUnitName" value="testPersistenceUnit"/>  
     <property name="dataSource" ref="dataSource"/>  
 </bean>  

Ketika di run lewat mvn jetty terjadi error, karena JNDI name tidak temukan.

 2015-06-19 11:07:04.474:WARN:oejw.WebAppContext:main: Failed startup of context o.e.j.m.p.JettyWebAppContext@7270fd39{/organika,file:/Data/Data-Project/Nostra/Organika/sources/nostratech-farming-server/nostra-web/src/main/webapp/,STARTING}{file:/Data/Data-Project/Nostra/Organika/sources/nostratech-farming-server/nostra-web/src/main/webapp/}  
 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in file [/Data/Data-Project/Nostra/Organika/sources/nostratech-farming-server/nostra-web/target/classes/spring/applicationContext.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException:  
 Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is javax.naming.NameNotFoundException; remaining name 'jdbc/SampleDB'  
 .....  
 Caused by:  
 org.springframework.beans.factory.BeanCreationException:   
 Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is javax.naming.NameNotFoundException; remaining name 'jdbc/SampleDB'  

Salah satu solusinya adalah saya harus menginstall standalone jetty dan menambahkan JNDI config di jetty nya. Karena hal itu cukup rumit maka saya tidak melakukannya.
Cara lain yg saya lakukan adalah memasang JNDI di maven jetty plugin.
Di folder resource kita buat file jetty-env.xml.



Di dalamnya kita definisikan JNDI yg kita pakai name nya kita samakan saja dengan yg dipakai di server.
 <?xml version="1.0" encoding="UTF-8"?>  
 <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">  
 <Configure id ="sampledb" class="org.eclipse.jetty.webapp.WebAppContext">  
   <New id="SampleDB" class="org.eclipse.jetty.plus.jndi.Resource">  
     <Arg>jdbc/sampleDB</Arg>  
         <Arg>  
     <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">  
       <Set name="Url">jdbc:mysql://localhost:3306/test_db</Set>  
       <Set name="User">root</Set>  
       <Set name="Password"></Set>  
     </New>  
     </Arg>  
   </New>  
 </Configure>  

Setelah itu kita panggil jetty-env.xml itu di config jetty plugin (pom.xml)
di configuration :
<jettyXml>src/main/resources/jetty-env.xml</jettyXml>
       <plugin>  
         <groupId>org.eclipse.jetty</groupId>  
         <artifactId>jetty-maven-plugin</artifactId>  
         <version>9.1.2.v20140210</version>  
                     <configuration>  
           <jettyXml>src/main/resources/jetty-env.xml</jettyXml>  
                          <webAppConfig>  
                               <contextPath>/${war.name}</contextPath>  
                          </webAppConfig>  
           <stopKey/>  
           <stopPort/>    
         <dependencies>  
           <dependency>  
             <groupId>mysql</groupId>  
             <artifactId>mysql-connector-java</artifactId>  
             <version>5.1.30</version>  
             <type>jar</type>  
           </dependency>  
         </dependencies>  
                </plugin>  

Kita running lagi mvn jetty:run.


Yes akhirnya bisa juga.

Referensi : https://wiki.eclipse.org/Jetty/Howto/Configure_JNDI_Datasource
                  https://wiki.eclipse.org/Jetty/Feature/JNDI

Selamat mencoba.



Monday, June 10, 2013

Konfigurasi JPA dengan JDBC Data Source pada WebLogic 10.3

Sekilas tentang Connection Pooling

Connection Pool merupakan sebuah teknik untuk membuat aplikasi langsung dapat menggunakan koneksi database tanpa harus menangani pembuatan atau pemutusan koneksi tersebut.

Sekilas tentang JDBC Data Source

Data Source menyediakan koneksi ke database melalui connection pooling, dan dapat me-manage koneksinya. Umumnya sebuah data source memiliki JNDI name, yang akan digunakan oleh aplikasi untuk me-lookup data source lalu kemudian dapat mengambil koneksi dari connection pooling.

Keuntungan dari penggunaan connection pooling dan data source antara lain ialah :
  • Aplikasi tidak lagi perlu mengurus bagaimana membuat/memutus koneksi ke database.
  • Apabila ada perubahan koneksi database, aplikasi tidak perlu berubah. Karena perubahan terjadi pada konfigurasi data source.
  • Jumlah koneksi database yang digunakan oleh aplikasi dapat terkontrol sesuai dengan konfigurasi pada data source, misal maximum jumlah koneksi 10 pada konfigurasi, maka dengan jumlah yang sama koneksi akan dibuat oleh data source.

Konfigurasi persistence.xml

<persistence-unit name="samplePersistenceUnit" transaction-type="JTA">
 
 <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
 <jta-data-source>jdbc/sampleDS</jta-data-source>
 <non-jta-data-source>jdbc/sampleDS</non-jta-data-source>
 <class>com.nostra.um.domain.User</class>
 <exclude-unlisted-classes>true</exclude-unlisted-classes>
 
 <properties>
 <property name="eclipselink.ddl-generation" value="create-tables" />
 <property name="eclipselink.logging.level" value="FINEST" />
 <property name="eclipselink.target-server" value="WebLogic_10" />
 </properties>
</persistence-unit>

  • Jika di-deploy pada container JEE (seperti WebLogic) default transaction-type-nya ialah JTA.
  • Isi elemen jta-data-source dan non-jta-data-source dengan JNDI Name pada Home -> Summary of JDBC Data Sources 
  • Pada property eclipselink.ddl-generation, jika berisi : 
    • create-tables : jpa akan melakukan proses create tabel sesuai dengan object model yang terdaftar di persistence.xml
    • drop-and-create-tables : jpa akan melakukan proses drop dan create tabel sesuai dengan object model yang terdaftar di persistence.xml
    • none : jpa tidak akan melakukan proses create/drop tabel.
  • Dan jika ingin merubah koneksi database pada JDBC Data Source seperti host, username, password dan lainnya, maka server harus di-restart. Karena proses pembuatan koneksi pada connection pooling terjadi saat server di-start.


Semoga bermanfaat, Cheers!