{"id":34153,"date":"2025-11-12T01:40:57","date_gmt":"2025-11-11T22:40:57","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=34153"},"modified":"2025-11-12T01:40:57","modified_gmt":"2025-11-11T22:40:57","slug":"hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/","title":{"rendered":"Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>Modern web uygulamalar\u0131, veritabanlar\u0131yla etkile\u015fim kurma ihtiyac\u0131 duyar. Bu etkile\u015fimlerin y\u00f6netimi, uygulaman\u0131n performans\u0131, \u00f6l\u00e7eklenebilirli\u011fi ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir. Geleneksel olarak, her veritaban\u0131 i\u015flemi i\u00e7in yeni bir ba\u011flant\u0131 a\u00e7\u0131p kapatmak hem maliyetli hem de hataya a\u00e7\u0131k bir yakla\u015f\u0131md\u0131r. Bu sorunlar\u0131 a\u015fmak i\u00e7in ba\u011flant\u0131 havuzlar\u0131 ve uygulama sunucular\u0131n\u0131n sundu\u011fu kaynak y\u00f6netimi mekanizmalar\u0131 devreye girer. Bu makalede, Java tabanl\u0131 uygulamalarda veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 y\u00f6netmenin en etkili yollar\u0131ndan biri olan Hibernate, Tomcat uygulama sunucusu ve JNDI (Java Naming and Directory Interface) DataSource entegrasyonunu detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<p>Bu rehberin amac\u0131, geli\u015ftiricilere Hibernate ORM (Object-Relational Mapping) \u00e7at\u0131s\u0131n\u0131 kullanarak Tomcat \u00fczerinde JNDI DataSource&#8217;u nas\u0131l yap\u0131land\u0131racaklar\u0131n\u0131 ve y\u00f6neteceklerini ad\u0131m ad\u0131m g\u00f6stermektir. Konfig\u00fcrasyon dosyalar\u0131ndan \u00f6rnek kodlara, s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan sorunlardan en iyi pratiklere kadar t\u00fcm s\u00fcreci ele alarak, verimli ve sa\u011flam veritaban\u0131 ba\u011flant\u0131 y\u00f6netimi stratejileri olu\u015fturman\u0131za yard\u0131mc\u0131 olmay\u0131 hedefliyoruz.<\/p>\n<h2>Veritaban\u0131 Ba\u011flant\u0131 Y\u00f6netiminde Kar\u015f\u0131la\u015f\u0131lan Zorluklar ve \u00c7\u00f6z\u00fcmler<\/h2>\n<p>Veritaban\u0131 ba\u011flant\u0131lar\u0131, bir uygulaman\u0131n en de\u011ferli kaynaklar\u0131ndan biridir. Her ba\u011flant\u0131n\u0131n kurulmas\u0131, kimlik do\u011frulama, yetkilendirme ve a\u011f \u00fczerinden ileti\u015fim gibi ad\u0131mlar\u0131 i\u00e7erir. Bu s\u00fcre\u00e7ler, \u00f6nemli miktarda zaman ve sistem kayna\u011f\u0131 t\u00fcketebilir. Geleneksel olarak, bir uygulama her veritaban\u0131 i\u015flemi i\u00e7in yeni bir ba\u011flant\u0131 a\u00e7\u0131p i\u015fi bitti\u011finde kapat\u0131rsa, a\u015fa\u011f\u0131daki sorunlarla kar\u015f\u0131la\u015f\u0131l\u0131r:<\/p>\n<p>*   <strong>Performans Kayb\u0131:<\/strong> Her ba\u011flant\u0131 a\u00e7ma ve kapatma i\u015flemi, \u00f6zellikle y\u00fcksek trafikli uygulamalarda ciddi performans darbo\u011fazlar\u0131na yol a\u00e7ar.<br \/>\n*   <strong>Kaynak S\u0131z\u0131nt\u0131lar\u0131:<\/strong> Ba\u011flant\u0131lar\u0131n d\u00fczg\u00fcn bir \u015fekilde kapat\u0131lmamas\u0131 veya hata durumlar\u0131nda a\u00e7\u0131k kalmas\u0131, veritaban\u0131 sunucusunda ba\u011flant\u0131 havuzunun t\u00fckenmesine ve uygulaman\u0131n \u00e7\u00f6kmesine neden olabilir.<br \/>\n*   <strong>Kod Karma\u015f\u0131kl\u0131\u011f\u0131:<\/strong> Her veritaban\u0131 eri\u015fim noktas\u0131nda ba\u011flant\u0131 y\u00f6netim kodunu tekrarlamak, kodun okunabilirli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini azalt\u0131r.<br \/>\n*   <strong>\u00d6l\u00e7eklenebilirlik Sorunlar\u0131:<\/strong> Ayn\u0131 anda \u00e7ok say\u0131da ba\u011flant\u0131 iste\u011fi, veritaban\u0131 sunucusunu a\u015f\u0131r\u0131 y\u00fckleyebilir ve uygulaman\u0131n \u00f6l\u00e7eklenmesini zorla\u015ft\u0131r\u0131r.<\/p>\n<p>Bu sorunlar\u0131 \u00e7\u00f6zmek i\u00e7in &#8220;ba\u011flant\u0131 havuzlar\u0131&#8221; (connection pools) kavram\u0131 ortaya \u00e7\u0131km\u0131\u015ft\u0131r. Bir ba\u011flant\u0131 havuzu, belirli say\u0131da veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 \u00f6nceden olu\u015fturur ve bir havuzda saklar. Uygulaman\u0131n bir ba\u011flant\u0131ya ihtiyac\u0131 oldu\u011funda, havuzdan mevcut bir ba\u011flant\u0131y\u0131 al\u0131r; i\u015fi bitti\u011finde ise ba\u011flant\u0131y\u0131 kapatmak yerine havuza geri verir. Bu yakla\u015f\u0131m, ba\u011flant\u0131 a\u00e7ma\/kapatma maliyetini ortadan kald\u0131rarak performans\u0131 art\u0131r\u0131r, kaynak s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nler ve kod karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 azalt\u0131r.<\/p>\n<p>Ba\u011flant\u0131 havuzlar\u0131n\u0131 y\u00f6netmenin bir di\u011fer \u00f6nemli ad\u0131m\u0131 ise bu havuzlar\u0131 uygulaman\u0131n kendisinden ba\u011f\u0131ms\u0131z olarak yap\u0131land\u0131rmak ve y\u00f6netmektir. \u0130\u015fte bu noktada JNDI devreye girer. JNDI, uygulama sunucular\u0131n\u0131n (Tomcat gibi) kaynaklar\u0131 (veritaban\u0131 ba\u011flant\u0131 havuzlar\u0131, mesaj kuyruklar\u0131 vb.) merkezi bir yerden yap\u0131land\u0131rmas\u0131na ve uygulamalar\u0131n bu kaynaklara isimleriyle eri\u015fmesine olanak tan\u0131r.<\/p>\n<h2>JNDI Nedir ve Neden Kullan\u0131l\u0131r?<\/h2>\n<p>JNDI (Java Naming and Directory Interface), Java uygulamalar\u0131n\u0131n \u00e7e\u015fitli adland\u0131rma ve dizin hizmetlerine eri\u015fmesini sa\u011flayan bir Java API&#8217;sidir. Bu hizmetler, nesnelerin isimleriyle bulunmas\u0131n\u0131 ve eri\u015filmesini sa\u011flar. JNDI, bir t\u00fcr &#8220;telefon rehberi&#8221; gibi d\u00fc\u015f\u00fcn\u00fclebilir; bir kayna\u011f\u0131n (\u00f6rne\u011fin, bir veritaban\u0131 ba\u011flant\u0131 havuzu) belirli bir isimle kaydedildi\u011fi ve uygulamalar\u0131n bu ismi kullanarak kayna\u011fa eri\u015febildi\u011fi bir mekanizma sunar.<\/p>\n<p>JNDI&#8217;\u0131n temel bile\u015fenleri \u015funlard\u0131r:<br \/>\n*   <strong>Context (Ba\u011flam):<\/strong> Bir adland\u0131rma sistemindeki belirli bir noktay\u0131 temsil eder. Kaynaklar genellikle bir ba\u011flam alt\u0131nda organize edilir.<br \/>\n*   <strong>Name (\u0130sim):<\/strong> Bir kayna\u011f\u0131 tan\u0131mlamak i\u00e7in kullan\u0131lan dizge. \u00d6rne\u011fin, <code>java:comp\/env\/jdbc\/MyDataSource<\/code>.<br \/>\n*   <strong>Object (Nesne):<\/strong> JNDI arac\u0131l\u0131\u011f\u0131yla aranan ve bulunan ger\u00e7ek kaynak (\u00f6rne\u011fin, bir <code>javax.sql.DataSource<\/code> nesnesi).<\/p>\n<p>JNDI&#8217;\u0131n avantajlar\u0131, \u00f6zellikle kurumsal uygulamalarda ve uygulama sunucusu ortamlar\u0131nda belirginle\u015fir:<br \/>\n*   <strong>Konfig\u00fcrasyonun Ayr\u0131lmas\u0131:<\/strong> Veritaban\u0131 kimlik bilgileri, ba\u011flant\u0131 havuzu ayarlar\u0131 gibi hassas bilgiler do\u011frudan uygulama kodundan veya uygulama paketinden ayr\u0131l\u0131r. Bu bilgiler uygulama sunucusunun konfig\u00fcrasyon dosyalar\u0131nda tutulur. Bu, uygulaman\u0131n farkl\u0131 ortamlara (geli\u015ftirme, test, \u00fcretim) kolayca da\u011f\u0131t\u0131labilmesini sa\u011flar, \u00e7\u00fcnk\u00fc her ortam kendi veritaban\u0131 ayarlar\u0131n\u0131 sunucu seviyesinde yap\u0131land\u0131rabilir.<br \/>\n*   <strong>Merkezi Kaynak Y\u00f6netimi:<\/strong> Uygulama sunucusu, JNDI arac\u0131l\u0131\u011f\u0131yla sunulan kaynaklar\u0131 (DataSource gibi) merkezi olarak y\u00f6netir. Bu, ba\u011flant\u0131 havuzunun ya\u015fam d\u00f6ng\u00fcs\u00fc, ba\u011flant\u0131 s\u0131z\u0131nt\u0131lar\u0131n\u0131n tespiti ve kaynak izleme gibi g\u00f6revleri uygulama sunucusunun sorumlulu\u011funa b\u0131rak\u0131r.<br \/>\n*   <strong>Esneklik ve Ta\u015f\u0131nabilirlik:<\/strong> Uygulama, do\u011frudan JDBC s\u00fcr\u00fcc\u00fcs\u00fc API&#8217;leri yerine JNDI ad\u0131n\u0131 kullanarak bir <code>DataSource<\/code>&#8216;a eri\u015fti\u011fi i\u00e7in, altta yatan veritaban\u0131 veya ba\u011flant\u0131 havuzu implementasyonu de\u011fi\u015fse bile uygulama kodunda herhangi bir de\u011fi\u015fiklik yap\u0131lmas\u0131na gerek kalmaz. Uygulama, JNDI ad\u0131n\u0131 \u00e7\u00f6zd\u00fc\u011f\u00fcnde her zaman bir <code>DataSource<\/code> nesnesi bekler.<br \/>\n*   <strong>G\u00fcvenlik:<\/strong> Veritaban\u0131 kullan\u0131c\u0131 ad\u0131 ve \u015fifresi gibi hassas bilgiler, uygulama kodunda veya paketinde yer almad\u0131\u011f\u0131 i\u00e7in daha g\u00fcvenli bir \u015fekilde saklanabilir ve y\u00f6netilebilir.<\/p>\n<p><code>DataSource<\/code>, JNDI&#8217;\u0131n en yayg\u0131n kullan\u0131mlar\u0131ndan biridir. <code>javax.sql.DataSource<\/code> aray\u00fcz\u00fc, uygulamalar\u0131n veritaban\u0131 ba\u011flant\u0131lar\u0131na eri\u015fmek i\u00e7in standart bir yol sa\u011flar. Bir <code>DataSource<\/code> nesnesi, genellikle bir ba\u011flant\u0131 havuzu implementasyonu taraf\u0131ndan sa\u011flan\u0131r ve JNDI arac\u0131l\u0131\u011f\u0131yla uygulaman\u0131n kullan\u0131m\u0131na sunulur.<\/p>\n<h2>Tomcat ve DataSource Yap\u0131land\u0131rmas\u0131<\/h2>\n<p>Tomcat, Java Servlet ve JSP teknolojilerini destekleyen a\u00e7\u0131k kaynakl\u0131 bir web sunucusudur. Ayn\u0131 zamanda, JNDI arac\u0131l\u0131\u011f\u0131yla kaynaklar\u0131 (DataSource gibi) uygulamalara sunabilen hafif bir uygulama sunucusu olarak da i\u015flev g\u00f6r\u00fcr. Tomcat&#8217;te bir DataSource yap\u0131land\u0131rmak i\u00e7in genellikle <code>context.xml<\/code> veya <code>server.xml<\/code> dosyalar\u0131 kullan\u0131l\u0131r.<\/p>\n<p>*   <strong><code>context.xml<\/code>:<\/strong> Bu dosya, belirli bir web uygulamas\u0131na (WAR dosyas\u0131) \u00f6zg\u00fc ba\u011flam ayarlar\u0131n\u0131 i\u00e7erir. <code>META-INF\/context.xml<\/code> olarak uygulaman\u0131n i\u00e7inde yer alabilir veya Tomcat&#8217;in <code>conf\/Catalina\/localhost\/<\/code> dizininde uygulaman\u0131n ad\u0131yla (<code>myapp.xml<\/code>) bulunabilir. Bu, bir DataSource&#8217;u yaln\u0131zca belirli bir uygulaman\u0131n kullanmas\u0131n\u0131 istedi\u011finizde tercih edilen y\u00f6ntemdir.<br \/>\n*   <strong><code>server.xml<\/code>:<\/strong> Bu dosya, Tomcat sunucusunun genel konfig\u00fcrasyonunu i\u00e7erir. Bir DataSource&#8217;u <code>server.xml<\/code> i\u00e7inde tan\u0131mlamak, t\u00fcm uygulamalar\u0131n bu DataSource&#8217;a eri\u015febilece\u011fi anlam\u0131na gelir. Genellikle, sunucu genelinde eri\u015filebilir olmas\u0131 gereken kaynaklar i\u00e7in kullan\u0131l\u0131r. Ancak, <code>context.xml<\/code>&#8216;e g\u00f6re daha az esneklik sunar, \u00e7\u00fcnk\u00fc uygulamalar\u0131n yeniden da\u011f\u0131t\u0131lmas\u0131 s\u0131ras\u0131nda bu dosyan\u0131n elle d\u00fczenlenmesi gerekebilir. En iyi uygulama, m\u00fcmk\u00fcnse <code>context.xml<\/code>&#8216;i kullanmakt\u0131r.<\/p>\n<h3>Tomcat <code>context.xml<\/code> Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>Bir DataSource&#8217;u Tomcat&#8217;in <code>context.xml<\/code> dosyas\u0131nda tan\u0131mlamak i\u00e7in <code><Resource><\/code> elementini kullan\u0131r\u0131z. Bu element, JNDI&#8217;da eri\u015filebilir olacak bir kayna\u011f\u0131 tan\u0131mlar. A\u015fa\u011f\u0131da, bir MySQL ve bir PostgreSQL veritaban\u0131 i\u00e7in \u00f6rnek bir <code>context.xml<\/code> yap\u0131land\u0131rmas\u0131 bulunmaktad\u0131r. Bu dosya, web uygulaman\u0131z\u0131n <code>META-INF<\/code> dizinine yerle\u015ftirilmelidir (<code>WEB-INF<\/code> de\u011fil).<\/p>\n<p><strong>MySQL \u0130\u00e7in \u00d6rnek <code>context.xml<\/code>:<\/strong><\/p>\n<pre><code class=\"language-xml\"><?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Context>\n    <!-- JNDI DataSource Tan\u0131m\u0131 -->\n    <Resource name=\"jdbc\/MySqlDataSource\"\n              auth=\"Container\"\n              type=\"javax.sql.DataSource\"\n              factory=\"org.apache.tomcat.jdbc.pool.DataSourceFactory\"\n              driverClassName=\"com.mysql.cj.jdbc.Driver\"\n              url=\"jdbc:mysql:\/\/localhost:3306\/mydatabase?serverTimezone=UTC\"\n              username=\"root\"\n              password=\"mysecretpassword\"\n              maxActive=\"100\"\n              maxIdle=\"30\"\n              maxWait=\"10000\"\n              removeAbandoned=\"true\"\n              removeAbandonedTimeout=\"60\"\n              logAbandoned=\"true\" \/>\n<\/Context><\/code><\/pre>\n<p><strong>PostgreSQL \u0130\u00e7in \u00d6rnek <code>context.xml<\/code>:<\/strong><\/p>\n<pre><code class=\"language-xml\"><?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Context>\n    <!-- JNDI DataSource Tan\u0131m\u0131 -->\n    <Resource name=\"jdbc\/PostgreSqlDataSource\"\n              auth=\"Container\"\n              type=\"javax.sql.DataSource\"\n              factory=\"org.apache.tomcat.jdbc.pool.DataSourceFactory\"\n              driverClassName=\"org.postgresql.Driver\"\n              url=\"jdbc:postgresql:\/\/localhost:5432\/mydatabase\"\n              username=\"postgres\"\n              password=\"mysecretpassword\"\n              maxActive=\"100\"\n              maxIdle=\"30\"\n              maxWait=\"10000\"\n              removeAbandoned=\"true\"\n              removeAbandonedTimeout=\"60\"\n              logAbandoned=\"true\" \/>\n<\/Context><\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rneklerde kullan\u0131lan \u00f6nemli nitelikler:<br \/>\n*   <code>name<\/code>: Bu, JNDI a\u011fac\u0131ndaki kayna\u011f\u0131n ad\u0131d\u0131r. Uygulama i\u00e7inde bu ad\u0131 kullanarak DataSource&#8217;a eri\u015filecektir (\u00f6rne\u011fin, <code>java:comp\/env\/jdbc\/MySqlDataSource<\/code>).<br \/>\n*   <code>auth<\/code>: Kimlik do\u011frulama mekanizmas\u0131n\u0131 belirtir. <code>Container<\/code> de\u011feri, Tomcat&#8217;in kayna\u011f\u0131 y\u00f6netti\u011fini ve kimlik do\u011frulamas\u0131n\u0131 yapt\u0131\u011f\u0131n\u0131 g\u00f6sterir.<br \/>\n*   <code>type<\/code>: Kayna\u011f\u0131n tam nitelikli s\u0131n\u0131f ad\u0131d\u0131r. Bir veritaban\u0131 ba\u011flant\u0131 havuzu i\u00e7in <code>javax.sql.DataSource<\/code> kullan\u0131l\u0131r.<br \/>\n*   <code>factory<\/code>: DataSource nesnesini olu\u015fturan fabrika s\u0131n\u0131f\u0131d\u0131r. Tomcat&#8217;in kendi JDBC ba\u011flant\u0131 havuzu implementasyonu olan <code>org.apache.tomcat.jdbc.pool.DataSourceFactory<\/code> yayg\u0131n olarak kullan\u0131l\u0131r. Alternatif olarak Apache Commons DBCP veya HikariCP gibi ba\u015fka havuzlar da kullan\u0131labilir.<br \/>\n*   <code>driverClassName<\/code>: Kullan\u0131lacak JDBC s\u00fcr\u00fcc\u00fcs\u00fcn\u00fcn tam s\u0131n\u0131f ad\u0131d\u0131r. MySQL i\u00e7in <code>com.mysql.cj.jdbc.Driver<\/code>, PostgreSQL i\u00e7in <code>org.postgresql.Driver<\/code>.<br \/>\n*   <code>url<\/code>: Veritaban\u0131n\u0131n ba\u011flant\u0131 URL&#8217;si.<br \/>\n*   <code>username<\/code>: Veritaban\u0131na ba\u011flanmak i\u00e7in kullan\u0131lacak kullan\u0131c\u0131 ad\u0131.<br \/>\n*   <code>password<\/code>: Veritaban\u0131 kullan\u0131c\u0131s\u0131n\u0131n \u015fifresi.<br \/>\n*   <code>maxActive<\/code>: Ayn\u0131 anda a\u00e7\u0131labilecek maksimum ba\u011flant\u0131 say\u0131s\u0131.<br \/>\n*   <code>maxIdle<\/code>: Havuzda bo\u015fta kalabilecek maksimum ba\u011flant\u0131 say\u0131s\u0131.<br \/>\n*   <code>maxWait<\/code>: Bir ba\u011flant\u0131 i\u00e7in beklerken maksimum beklenecek s\u00fcre (milisaniye).<br \/>\n*   <code>removeAbandoned<\/code>, <code>removeAbandonedTimeout<\/code>, <code>logAbandoned<\/code>: Uzun s\u00fcre kullan\u0131lmayan (terk edilmi\u015f) ba\u011flant\u0131lar\u0131n tespiti ve kald\u0131r\u0131lmas\u0131 i\u00e7in kullan\u0131lan ayarlar.<\/p>\n<h3>Gerekli JDBC S\u00fcr\u00fcc\u00fcs\u00fcn\u00fcn Eklenmesi<\/h3>\n<p>Tomcat&#8217;in tan\u0131mlad\u0131\u011f\u0131n\u0131z DataSource&#8217;u kullanabilmesi i\u00e7in ilgili JDBC s\u00fcr\u00fcc\u00fcs\u00fcn\u00fcn Tomcat&#8217;in classpath&#8217;inde olmas\u0131 gerekir. Bu genellikle, veritaban\u0131 s\u00fcr\u00fcc\u00fcs\u00fcn\u00fcn JAR dosyas\u0131n\u0131 Tomcat&#8217;in <code>lib<\/code> dizinine (<code><TOMCAT_HOME>\/lib<\/code>) kopyalamakla yap\u0131l\u0131r.<\/p>\n<p>*   MySQL i\u00e7in: <code>mysql-connector-java-X.Y.Z.jar<\/code><br \/>\n*   PostgreSQL i\u00e7in: <code>postgresql-X.Y.jar<\/code><\/p>\n<p>Bu ad\u0131m\u0131 atlamak, uygulaman\u0131z\u0131n <code>No suitable driver found<\/code> gibi hatalar almas\u0131na neden olacakt\u0131r.<\/p>\n<h2>Hibernate ve JNDI DataSource Entegrasyonu<\/h2>\n<p>Hibernate, Java uygulamalar\u0131 i\u00e7in pop\u00fcler bir ORM (Object-Relational Mapping) \u00e7at\u0131s\u0131d\u0131r. Nesne odakl\u0131 bir yakla\u015f\u0131mla veritaban\u0131 i\u015flemlerini basitle\u015ftirir. Hibernate&#8217;in JNDI DataSource ile entegrasyonu, veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131n y\u00f6netimini Hibernate&#8217;ten ay\u0131rarak uygulama sunucusuna b\u0131rak\u0131r. Bu, yukar\u0131da bahsedilen t\u00fcm JNDI avantajlar\u0131n\u0131n Hibernate uygulamalar\u0131nda da kullan\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Hibernate, JNDI DataSource&#8217;u iki ana \u015fekilde yap\u0131land\u0131rabilir: JPA (Java Persistence API) standard\u0131n\u0131 kullanan <code>persistence.xml<\/code> dosyas\u0131 arac\u0131l\u0131\u011f\u0131yla veya eski Hibernate konfig\u00fcrasyon dosyas\u0131 olan <code>hibernate.cfg.xml<\/code> arac\u0131l\u0131\u011f\u0131yla.<\/p>\n<h3><code>persistence.xml<\/code> (JPA) Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>JPA, Java EE ve Java SE uygulamalar\u0131nda ORM i\u00e7in standart bir API&#8217;dir. Hibernate, JPA&#8217;n\u0131n pop\u00fcler bir implementasyonudur. JPA tabanl\u0131 bir uygulamada JNDI DataSource kullanmak i\u00e7in <code>META-INF\/persistence.xml<\/code> dosyas\u0131nda <code><jta-data-source><\/code> veya <code><non-jta-data-source><\/code> etiketlerini kullan\u0131r\u0131z.<\/p>\n<p>*   <code><jta-data-source><\/code>: E\u011fer uygulaman\u0131z JTA (Java Transaction API) taraf\u0131ndan y\u00f6netilen da\u011f\u0131t\u0131k i\u015flemleri kullan\u0131yorsa (genellikle tam te\u015fekk\u00fcll\u00fc Java EE sunucular\u0131nda), bu etiketi kullanmal\u0131s\u0131n\u0131z. Tomcat hafif bir sunucu oldu\u011fu i\u00e7in genellikle JTA deste\u011fi tam de\u011fildir veya harici bir JTA implementasyonu gerektirir.<br \/>\n*   <code><non-jta-data-source><\/code>: E\u011fer uygulaman\u0131z JTA taraf\u0131ndan y\u00f6netilmeyen yerel (resource-local) i\u015flemleri kullan\u0131yorsa (Tomcat gibi hafif sunucularda yayg\u0131nd\u0131r), bu etiketi kullanmal\u0131s\u0131n\u0131z.<\/p>\n<p><strong>\u00d6rnek <code>persistence.xml<\/code> (Non-JTA DataSource):<\/strong><\/p>\n<pre><code class=\"language-xml\"><?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<persistence version=\"2.2\"\n             xmlns=\"http:\/\/xmlns.jcp.org\/xml\/ns\/persistence\"\n             xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n             xsi:schemaLocation=\"http:\/\/xmlns.jcp.org\/xml\/ns\/persistence\n             http:\/\/xmlns.jcp.org\/xml\/ns\/persistence\/persistence_2_2.xsd\">\n\n    <persistence-unit name=\"myPersistenceUnit\" transaction-type=\"RESOURCE_LOCAL\">\n        <provider>org.hibernate.jpa.HibernatePersistenceProvider<\/provider>\n        <non-jta-data-source>java:comp\/env\/jdbc\/MySqlDataSource<\/non-jta-data-source>\n        <!-- veya java:comp\/env\/jdbc\/PostgreSqlDataSource -->\n\n        <properties>\n            <!-- Hibernate \u00d6zellikleri -->\n            <property name=\"hibernate.dialect\" value=\"org.hibernate.dialect.MySQL8Dialect\"\/>\n            <!-- veya org.hibernate.dialect.PostgreSQLDialect -->\n            <property name=\"hibernate.show_sql\" value=\"true\"\/>\n            <property name=\"hibernate.format_sql\" value=\"true\"\/>\n            <property name=\"hibernate.hbm2ddl.auto\" value=\"update\"\/> <!-- create, update, create-drop, validate, none -->\n            <property name=\"hibernate.connection.provider_class\" value=\"org.hibernate.connection.DatasourceConnectionProvider\"\/>\n            <!-- E\u011fer Tomcat'in DataSource'unu kullan\u0131yorsan\u0131z bu property gereklidir. -->\n        <\/properties>\n    <\/persistence-unit>\n<\/persistence><\/code><\/pre>\n<p>Burada <code><non-jta-data-source><\/code> etiketi i\u00e7ine, Tomcat <code>context.xml<\/code> dosyas\u0131nda tan\u0131mlad\u0131\u011f\u0131m\u0131z JNDI ad\u0131n\u0131 yaz\u0131yoruz (<code>java:comp\/env\/<\/code> \u00f6neki ile birlikte). <code>transaction-type=\"RESOURCE_LOCAL\"<\/code> ifadesi, JPA&#8217;n\u0131n veritaban\u0131 i\u015flemlerini do\u011frudan JDBC \u00fczerinden y\u00f6netece\u011fini belirtir.<\/p>\n<h3><code>hibernate.cfg.xml<\/code> (Legacy Hibernate) Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>E\u011fer uygulaman\u0131z eski Hibernate API&#8217;sini kullan\u0131yorsa ve JPA kullanm\u0131yorsa, <code>hibernate.cfg.xml<\/code> dosyas\u0131nda JNDI DataSource&#8217;u yap\u0131land\u0131rabilirsiniz.<\/p>\n<p><strong>\u00d6rnek <code>hibernate.cfg.xml<\/code>:<\/strong><\/p>\n<pre><code class=\"language-xml\"><?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE hibernate-configuration PUBLIC\n        \"-\/\/Hibernate\/Hibernate Configuration DTD 3.0\/\/EN\"\n        \"http:\/\/www.hibernate.org\/dtd\/hibernate-configuration-3.0.dtd\">\n<hibernate-configuration>\n    <session-factory>\n        <!-- JNDI DataSource ad\u0131 -->\n        <property name=\"hibernate.connection.datasource\">java:comp\/env\/jdbc\/MySqlDataSource<\/property>\n        <!-- veya java:comp\/env\/jdbc\/PostgreSqlDataSource -->\n\n        <!-- Hibernate \u00d6zellikleri -->\n        <property name=\"hibernate.dialect\">org.hibernate.dialect.MySQL8Dialect<\/property>\n        <!-- veya org.hibernate.dialect.PostgreSQLDialect -->\n        <property name=\"hibernate.show_sql\">true<\/property>\n        <property name=\"hibernate.format_sql\">true<\/property>\n        <property name=\"hibernate.hbm2ddl.auto\">update<\/property>\n\n        <!-- Di\u011fer Hibernate ayarlar\u0131 ve e\u015flemeler -->\n        <!-- <mapping class=\"com.example.entity.MyEntity\"\/> -->\n    <\/session-factory>\n<\/hibernate-configuration><\/code><\/pre>\n<p>Burada <code>hibernate.connection.datasource<\/code> \u00f6zelli\u011fi, JNDI ad\u0131n\u0131 belirtmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h3>Maven Ba\u011f\u0131ml\u0131l\u0131klar\u0131<\/h3>\n<p>Projenizde Hibernate ve ilgili veritaban\u0131 s\u00fcr\u00fcc\u00fclerini kullanabilmek i\u00e7in <code>pom.xml<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki ba\u011f\u0131ml\u0131l\u0131klar\u0131 eklemeniz gerekir:<\/p>\n<pre><code class=\"language-xml\"><dependencies>\n    <!-- Hibernate Core (JPA i\u00e7in de gereklidir) -->\n    <dependency>\n        <groupId>org.hibernate<\/groupId>\n        <artifactId>hibernate-core<\/artifactId>\n        <version>5.6.14.Final<\/version> <!-- G\u00fcncel s\u00fcr\u00fcm\u00fc kullan\u0131n -->\n    <\/dependency>\n\n    <!-- Hibernate EntityManager (JPA kullan\u0131yorsan\u0131z) -->\n    <dependency>\n        <groupId>org.hibernate<\/groupId>\n        <artifactId>hibernate-entitymanager<\/artifactId>\n        <version>5.6.14.Final<\/version> <!-- hibernate-core ile ayn\u0131 s\u00fcr\u00fcm -->\n    <\/dependency>\n\n    <!-- MySQL JDBC S\u00fcr\u00fcc\u00fcs\u00fc -->\n    <dependency>\n        <groupId>mysql<\/groupId>\n        <artifactId>mysql-connector-java<\/artifactId>\n        <version>8.0.33<\/version> <!-- G\u00fcncel s\u00fcr\u00fcm\u00fc kullan\u0131n -->\n    <\/dependency>\n    <!-- VEYA PostgreSQL JDBC S\u00fcr\u00fcc\u00fcs\u00fc -->\n    <!--\n    <dependency>\n        <groupId>org.postgresql<\/groupId>\n        <artifactId>postgresql<\/artifactId>\n        <version>42.6.0<\/version>\n    <\/dependency>\n    -->\n\n    <!-- Servlet API (Tomcat \u00fczerinde \u00e7al\u0131\u015f\u0131yorsan\u0131z) -->\n    <dependency>\n        <groupId>javax.servlet<\/groupId>\n        <artifactId>javax.servlet-api<\/artifactId>\n        <version>4.0.1<\/version>\n        <scope>provided<\/scope> <!-- Tomcat taraf\u0131ndan sa\u011fland\u0131\u011f\u0131 i\u00e7in \"provided\" -->\n    <\/dependency>\n\n    <!-- JNDI API (genellikle Tomcat taraf\u0131ndan sa\u011flan\u0131r, ancak bazen ba\u011f\u0131ml\u0131l\u0131k olarak eklenmesi gerekebilir) -->\n    <dependency>\n        <groupId>javax.naming<\/groupId>\n        <artifactId>jndi<\/artifactId>\n        <version>1.2.1<\/version>\n        <scope>provided<\/scope>\n    <\/dependency>\n\n<\/dependencies><\/code><\/pre>\n<p><strong>\u00d6nemli Not:<\/strong> JDBC s\u00fcr\u00fcc\u00fcs\u00fcn\u00fcn JAR dosyas\u0131, Tomcat&#8217;in <code>lib<\/code> dizinine kopyaland\u0131\u011f\u0131 i\u00e7in, Maven ba\u011f\u0131ml\u0131l\u0131klar\u0131nda <code>scope<\/code> olarak <code>provided<\/code> kullanmak mant\u0131kl\u0131 olabilir. Ancak, geli\u015ftirme ortam\u0131nda veya embedded Tomcat kullan\u0131rken projenizin ba\u011f\u0131ml\u0131l\u0131klar\u0131nda olmas\u0131 gerekir. En g\u00fcvenli yol, hem Tomcat&#8217;e kopyalamak hem de Maven&#8217;da <code>compile<\/code> scope&#8217;unda tutmakt\u0131r.<\/p>\n<h2>\u00d6rnek Uygulama Ad\u0131mlar\u0131<\/h2>\n<p>\u015eimdi, yukar\u0131da \u00f6\u011frendiklerimizi bir araya getirerek basit bir \u00f6rnek uygulama olu\u015ftural\u0131m.<\/p>\n<h3>Proje Yap\u0131s\u0131 Olu\u015fturma<\/h3>\n<p>Maven kullanarak yeni bir web uygulamas\u0131 projesi olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">mvn archetype:generate -DgroupId=com.example -DartifactId=HibernateJndiExample -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false<\/code><\/pre>\n<p>Olu\u015fan <code>pom.xml<\/code> dosyas\u0131n\u0131 yukar\u0131daki ba\u011f\u0131ml\u0131l\u0131klarla g\u00fcncelleyin.<\/p>\n<h3>Varl\u0131k S\u0131n\u0131f\u0131 Tan\u0131mlama<\/h3>\n<p>Basit bir <code>User<\/code> varl\u0131k s\u0131n\u0131f\u0131 olu\u015ftural\u0131m. <code>src\/main\/java\/com\/example\/model\/User.java<\/code>:<\/p>\n<pre><code class=\"language-java\">package com.example.model;\n\nimport javax.persistence.*;\nimport java.io.Serializable;\n\n@Entity\n@Table(name = \"users\")\npublic class User implements Serializable {\n\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private Long id;\n\n    @Column(name = \"username\", unique = true, nullable = false)\n    private String username;\n\n    @Column(name = \"email\", nullable = false)\n    private String email;\n\n    \/\/ Constructors\n    public User() {\n    }\n\n    public User(String username, String email) {\n        this.username = username;\n        this.email = email;\n    }\n\n    \/\/ Getters and Setters\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public String getEmail() {\n        return email;\n    }\n\n    public void setEmail(String email) {\n        this.email = email;\n    }\n\n    @Override\n    public String toString() {\n        return \"User{\" +\n               \"id=\" + id +\n               \", username='\" + username + '\\'' +\n               \", email='\" + email + '\\'' +\n               '}';\n    }\n}<\/code><\/pre>\n<h3><code>persistence.xml<\/code> Dosyas\u0131 Olu\u015fturma<\/h3>\n<p><code>src\/main\/resources\/META-INF\/persistence.xml<\/code> dosyas\u0131n\u0131 olu\u015fturun ve yukar\u0131daki \u00f6rnek <code>persistence.xml<\/code> i\u00e7eri\u011fini kullan\u0131n. <code>non-jta-data-source<\/code> ad\u0131n\u0131n Tomcat&#8217;teki ile e\u015fle\u015fti\u011finden emin olun.<\/p>\n<pre><code class=\"language-xml\"><!-- persistence.xml i\u00e7eri\u011fi buraya gelecek (yukar\u0131daki \u00f6rnekten kopyala) -->\n<persistence version=\"2.2\"\n             xmlns=\"http:\/\/xmlns.jcp.org\/xml\/ns\/persistence\"\n             xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n             xsi:schemaLocation=\"http:\/\/xmlns.jcp.org\/xml\/ns\/persistence\n             http:\/\/xmlns.jcp.org\/xml\/ns\/persistence\/persistence_2_2.xsd\">\n\n    <persistence-unit name=\"myPersistenceUnit\" transaction-type=\"RESOURCE_LOCAL\">\n        <provider>org.hibernate.jpa.HibernatePersistenceProvider<\/provider>\n        <non-jta-data-source>java:comp\/env\/jdbc\/MySqlDataSource<\/non-jta-data-source>\n        <!-- veya java:comp\/env\/jdbc\/PostgreSqlDataSource -->\n        <class>com.example.model.User<\/class> <!-- Varl\u0131k s\u0131n\u0131f\u0131n\u0131z\u0131 ekleyin -->\n        <properties>\n            <property name=\"hibernate.dialect\" value=\"org.hibernate.dialect.MySQL8Dialect\"\/>\n            <property name=\"hibernate.show_sql\" value=\"true\"\/>\n            <property name=\"hibernate.format_sql\" value=\"true\"\/>\n            <property name=\"hibernate.hbm2ddl.auto\" value=\"update\"\/>\n            <property name=\"hibernate.connection.provider_class\" value=\"org.hibernate.connection.DatasourceConnectionProvider\"\/>\n        <\/properties>\n    <\/persistence-unit>\n<\/persistence><\/code><\/pre>\n<h3>Tomcat <code>context.xml<\/code> Dosyas\u0131 Olu\u015fturma<\/h3>\n<p>Projenizin <code>src\/main\/webapp\/META-INF\/context.xml<\/code> dizininde bir <code>context.xml<\/code> dosyas\u0131 olu\u015fturun ve yukar\u0131daki MySQL veya PostgreSQL \u00f6rne\u011fine g\u00f6re yap\u0131land\u0131r\u0131n.<\/p>\n<pre><code class=\"language-xml\"><!-- context.xml i\u00e7eri\u011fi buraya gelecek (yukar\u0131daki \u00f6rnekten kopyala) -->\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Context>\n    <Resource name=\"jdbc\/MySqlDataSource\"\n              auth=\"Container\"\n              type=\"javax.sql.DataSource\"\n              factory=\"org.apache.tomcat.jdbc.pool.DataSourceFactory\"\n              driverClassName=\"com.mysql.cj.jdbc.Driver\"\n              url=\"jdbc:mysql:\/\/localhost:3306\/mydatabase?serverTimezone=UTC\"\n              username=\"root\"\n              password=\"mysecretpassword\"\n              maxActive=\"100\"\n              maxIdle=\"30\"\n              maxWait=\"10000\"\n              removeAbandoned=\"true\"\n              removeAbandonedTimeout=\"60\"\n              logAbandoned=\"true\" \/>\n<\/Context><\/code><\/pre>\n<p><strong>Not:<\/strong> <code>context.xml<\/code>&#8216;i <code>src\/main\/webapp\/META-INF\/<\/code> alt\u0131na koymak, WAR dosyas\u0131 olu\u015fturuldu\u011funda otomatik olarak <code>META-INF\/<\/code> dizinine yerle\u015fmesini sa\u011flar.<\/p>\n<h3>Veritaban\u0131 S\u00fcr\u00fcc\u00fcs\u00fcn\u00fc Tomcat&#8217;e Kopyalama<\/h3>\n<p>\u0130lgili JDBC s\u00fcr\u00fcc\u00fcs\u00fcn\u00fcn JAR dosyas\u0131n\u0131 (\u00f6rne\u011fin <code>mysql-connector-java-8.0.33.jar<\/code>) Tomcat kurulumunuzun <code>lib<\/code> dizinine (<code><TOMCAT_HOME>\/lib<\/code>) kopyalay\u0131n.<\/p>\n<h3>Veritaban\u0131 Olu\u015fturma ve Tablo Tan\u0131mlama<\/h3>\n<p>Veritaban\u0131 sunucunuzda (MySQL, PostgreSQL) <code>mydatabase<\/code> ad\u0131nda bir veritaban\u0131 olu\u015fturun. Hibernate <code>hbm2ddl.auto<\/code> \u00f6zelli\u011fi <code>update<\/code> olarak ayarland\u0131\u011f\u0131 i\u00e7in, uygulama ilk \u00e7al\u0131\u015ft\u0131\u011f\u0131nda <code>users<\/code> tablosunu otomatik olarak olu\u015fturacakt\u0131r.<\/p>\n<h3>DAO veya Hizmet Katman\u0131 Olu\u015fturma<\/h3>\n<p>Veritaban\u0131 i\u015flemlerini y\u00f6netecek bir DAO (Data Access Object) s\u0131n\u0131f\u0131 olu\u015ftural\u0131m. <code>src\/main\/java\/com\/example\/dao\/UserDao.java<\/code>:<\/p>\n<pre><code class=\"language-java\">package com.example.dao;\n\nimport com.example.model.User;\n\nimport javax.persistence.EntityManager;\nimport javax.persistence.EntityManagerFactory;\nimport javax.persistence.Persistence;\nimport java.util.List;\n\npublic class UserDao {\n\n    private EntityManagerFactory emf;\n\n    public UserDao() {\n        \/\/ persistence.xml'de tan\u0131mlanan persistence unit ad\u0131n\u0131 kullan\u0131n\n        emf = Persistence.createEntityManagerFactory(\"myPersistenceUnit\");\n    }\n\n    public void saveUser(User user) {\n        EntityManager em = emf.createEntityManager();\n        em.getTransaction().begin();\n        em.persist(user);\n        em.getTransaction().commit();\n        em.close();\n    }\n\n    public User findUserById(Long id) {\n        EntityManager em = emf.createEntityManager();\n        User user = em.find(User.class, id);\n        em.close();\n        return user;\n    }\n\n    public List<User> findAllUsers() {\n        EntityManager em = emf.createEntityManager();\n        List<User> users = em.createQuery(\"SELECT u FROM User u\", User.class).getResultList();\n        em.close();\n        return users;\n    }\n\n    public void updateUser(User user) {\n        EntityManager em = emf.createEntityManager();\n        em.getTransaction().begin();\n        em.merge(user);\n        em.getTransaction().commit();\n        em.close();\n    }\n\n    public void deleteUser(Long id) {\n        EntityManager em = emf.createEntityManager();\n        em.getTransaction().begin();\n        User user = em.find(User.class, id);\n        if (user != null) {\n            em.remove(user);\n        }\n        em.getTransaction().commit();\n        em.close();\n    }\n\n    public void close() {\n        if (emf != null && emf.isOpen()) {\n            emf.close();\n        }\n    }\n}<\/code><\/pre>\n<h3>Uygulama Da\u011f\u0131t\u0131m\u0131 ve Test<\/h3>\n<p>Basit bir Servlet ile DAO s\u0131n\u0131f\u0131n\u0131 kullanarak veritaban\u0131 i\u015flemlerini test edelim. <code>src\/main\/java\/com\/example\/servlet\/UserServlet.java<\/code>:<\/p>\n<pre><code class=\"language-java\">package com.example.servlet;\n\nimport com.example.dao.UserDao;\nimport com.example.model.User;\n\nimport javax.servlet.ServletException;\nimport javax.servlet.annotation.WebServlet;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.util.List;\n\n@WebServlet(\"\/users\")\npublic class UserServlet extends HttpServlet {\n\n    private UserDao userDao;\n\n    @Override\n    public void init() throws ServletException {\n        super.init();\n        userDao = new UserDao();\n    }\n\n    @Override\n    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {\n        response.setContentType(\"text\/html\");\n        PrintWriter out = response.getWriter();\n\n        out.println(\"<html><body>\");\n        out.println(\"\");\n\n        \/\/ Kullan\u0131c\u0131 kaydetme\n        User newUser = new User(\"john_doe\", \"john.doe@example.com\");\n        userDao.saveUser(newUser);\n        out.println(\"<p>Saved user: \" + newUser.getUsername() + \"<\/p>\");\n\n        \/\/ T\u00fcm kullan\u0131c\u0131lar\u0131 listeleme\n        List<User> users = userDao.findAllUsers();\n        out.println(\"<h2>All Users:<\/h2>\");\n        out.println(\"<ul>\");\n        for (User user : users) {\n            out.println(\"<li>\" + user.toString() + \"<\/li>\");\n        }\n        out.println(\"<\/ul>\");\n\n        \/\/ Bir kullan\u0131c\u0131y\u0131 bulma\n        User foundUser = userDao.findUserById(newUser.getId());\n        if (foundUser != null) {\n            out.println(\"<p>Found user by ID: \" + foundUser.getUsername() + \"<\/p>\");\n        }\n\n        out.println(\"<\/body><\/html>\");\n    }\n\n    @Override\n    public void destroy() {\n        super.destroy();\n        userDao.close(); \/\/ EntityManagerFactory'yi kapat\n    }\n}<\/code><\/pre>\n<p>Uygulamay\u0131 WAR dosyas\u0131 olarak paketleyin:<\/p>\n<pre><code class=\"language-bash\">mvn clean package<\/code><\/pre>\n<p>Olu\u015fan <code>HibernateJndiExample.war<\/code> dosyas\u0131n\u0131 Tomcat&#8217;in <code>webapps<\/code> dizinine kopyalay\u0131n. Tomcat&#8217;i ba\u015flat\u0131n ve taray\u0131c\u0131n\u0131zdan <code>http:\/\/localhost:8080\/HibernateJndiExample\/users<\/code> adresine gidin. Uygulama, veritaban\u0131na bir kullan\u0131c\u0131 eklemeli ve ard\u0131ndan t\u00fcm kullan\u0131c\u0131lar\u0131 listelemelidir. Tomcat konsolunda Hibernate&#8217;in \u00fcretti\u011fi SQL sorgular\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<h2>JNDI ve DataSource Kullan\u0131m\u0131n\u0131n Avantajlar\u0131 ve Dezavantajlar\u0131<\/h2>\n<h3>Avantajlar<\/h3>\n<p>*   <strong>Merkezi Y\u00f6netim ve Konfig\u00fcrasyonun Ayr\u0131lmas\u0131:<\/strong> Veritaban\u0131 ba\u011flant\u0131 detaylar\u0131 (URL, kullan\u0131c\u0131 ad\u0131, \u015fifre) uygulama kodundan veya uygulaman\u0131n JAR\/WAR dosyas\u0131ndan ayr\u0131 tutulur. Bu, uygulaman\u0131n farkl\u0131 da\u011f\u0131t\u0131m ortamlar\u0131na (geli\u015ftirme, test, \u00fcretim) kolayca adapte edilmesini sa\u011flar. Her ortam, kendi veritaban\u0131 ayarlar\u0131n\u0131 Tomcat&#8217;in <code>context.xml<\/code>&#8216;inde tan\u0131mlayabilir.<br \/>\n*   <strong>Kaynak Verimlili\u011fi:<\/strong> Uygulama sunucusu (Tomcat), ba\u011flant\u0131 havuzunu y\u00f6netir. Bu, ba\u011flant\u0131lar\u0131n tekrar tekrar a\u00e7\u0131l\u0131p kapat\u0131lmas\u0131 yerine havuzdan al\u0131n\u0131p geri verilmesini sa\u011flar, b\u00f6ylece veritaban\u0131 ba\u011flant\u0131 maliyetleri azal\u0131r ve performans artar.<br \/>\n*   <strong>Ta\u015f\u0131nabilirlik:<\/strong> Uygulama, JNDI ad\u0131n\u0131 kullanarak bir <code>DataSource<\/code>&#8216;a eri\u015fti\u011fi i\u00e7in, altta yatan veritaban\u0131 t\u00fcr\u00fc veya ba\u011flant\u0131 havuzu implementasyonu de\u011fi\u015fse bile uygulama kodunda herhangi bir de\u011fi\u015fiklik yap\u0131lmas\u0131na gerek kalmaz.<br \/>\n*   <strong>G\u00fcvenlik:<\/strong> Hassas veritaban\u0131 kimlik bilgileri, uygulama kodunda veya paketinde bulunmad\u0131\u011f\u0131 i\u00e7in daha g\u00fcvenli bir \u015fekilde saklanabilir ve y\u00f6netilebilir. Sunucu y\u00f6neticileri, bu bilgileri daha g\u00fcvenli bir \u015fekilde kontrol edebilir.<br \/>\n*   <strong>Uygulama Sunucusu \u00d6zellikleri:<\/strong> Tomcat gibi uygulama sunucular\u0131, ba\u011flant\u0131 havuzu izleme, otomatik yeniden ba\u011flant\u0131 denemeleri, ba\u011flant\u0131 s\u0131z\u0131nt\u0131s\u0131 tespiti gibi geli\u015fmi\u015f \u00f6zellikler sunar.<\/p>\n<h3>Dezavantajlar<\/h3>\n<p>*   <strong>Ba\u015flang\u0131\u00e7 Konfig\u00fcrasyonu Karma\u015f\u0131kl\u0131\u011f\u0131:<\/strong> JNDI ve DataSource kurulumu, \u00f6zellikle yeni ba\u015flayanlar i\u00e7in ek bir \u00f6\u011frenme e\u011frisi ve konfig\u00fcrasyon ad\u0131mlar\u0131 gerektirebilir. <code>context.xml<\/code> ve <code>persistence.xml<\/code> gibi birden fazla dosyan\u0131n do\u011fru \u015fekilde yap\u0131land\u0131r\u0131lmas\u0131 \u00f6nemlidir.<br \/>\n*   <strong>Geli\u015ftirme Ortam\u0131nda Ek Kurulum:<\/strong> Geli\u015ftirme s\u0131ras\u0131nda, uygulaman\u0131n bir Tomcat sunucusu \u00fczerinde \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 veya bir embedded Tomcat konfig\u00fcrasyonu gerektirebilir. Bu, IDE&#8217;de do\u011frudan bir <code>main<\/code> metoduyla test yapmaktan daha karma\u015f\u0131k olabilir.<br \/>\n*   <strong>JNDI \u0130sim \u00c7ak\u0131\u015fmalar\u0131:<\/strong> B\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda, JNDI adland\u0131rma \u00e7at\u0131\u015fmalar\u0131 ya\u015fanabilir, ancak iyi bir adland\u0131rma stratejisi ile bu \u00f6nlenebilir.<br \/>\n*   <strong>Hata Ay\u0131klama Zorluklar\u0131:<\/strong> JNDI hatalar\u0131 (\u00f6rne\u011fin <code>NameNotFoundException<\/code>), uygulaman\u0131n kendisinden ziyade sunucu konfig\u00fcrasyonunda bir sorun oldu\u011funa i\u015faret edebilir. Bu, hata ay\u0131klama s\u00fcrecini biraz daha karma\u015f\u0131k hale getirebilir.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular ve Sorun Giderme<\/h2>\n<h3><code>javax.naming.NameNotFoundException: Name [java:comp\/env\/jdbc\/MySqlDataSource] is not bound in this Context. Unable to find [jdbc].<\/code><\/h3>\n<p>*   <strong>Neden:<\/strong> Bu hata, uygulaman\u0131z\u0131n <code>persistence.xml<\/code> (veya <code>hibernate.cfg.xml<\/code>) dosyas\u0131nda belirtti\u011finiz JNDI ad\u0131n\u0131n Tomcat&#8217;te bulunamad\u0131\u011f\u0131 anlam\u0131na gelir.<br \/>\n*   <strong>\u00c7\u00f6z\u00fcm:<\/strong><br \/>\n    *   <code>context.xml<\/code> dosyas\u0131n\u0131n do\u011fru yerde (<code>src\/main\/webapp\/META-INF\/context.xml<\/code> veya Tomcat&#8217;in <code>conf\/Catalina\/localhost\/myapp.xml<\/code>) oldu\u011fundan emin olun.<br \/>\n    *   <code>context.xml<\/code> i\u00e7indeki <code><Resource name=\"jdbc\/MySqlDataSource\"><\/code> tan\u0131m\u0131n\u0131n do\u011fru oldu\u011fundan ve <code>persistence.xml<\/code> i\u00e7indeki adla tam olarak e\u015fle\u015fti\u011finden emin olun.<br \/>\n    *   Tomcat&#8217;i yeniden ba\u015flatt\u0131\u011f\u0131n\u0131zdan emin olun, \u00e7\u00fcnk\u00fc <code>context.xml<\/code> de\u011fi\u015fiklikleri genellikle yeniden ba\u015flatma gerektirir.<\/p>\n<h3><code>No suitable driver found for jdbc:mysql:\/\/localhost:3306\/mydatabase<\/code><\/h3>\n<p>*   <strong>Neden:<\/strong> Tomcat, veritaban\u0131na ba\u011flanmak i\u00e7in gerekli JDBC s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc bulam\u0131yor.<br \/>\n*   <strong>\u00c7\u00f6z\u00fcm:<\/strong> \u0130lgili JDBC s\u00fcr\u00fcc\u00fcs\u00fcn\u00fcn JAR dosyas\u0131n\u0131 (\u00f6rne\u011fin <code>mysql-connector-java-X.Y.Z.jar<\/code> veya <code>postgresql-X.Y.jar<\/code>) Tomcat&#8217;in <code>lib<\/code> dizinine (<code><TOMCAT_HOME>\/lib<\/code>) kopyalad\u0131\u011f\u0131n\u0131zdan emin olun ve Tomcat&#8217;i yeniden ba\u015flat\u0131n.<\/p>\n<h3>Ba\u011flant\u0131 Havuzu T\u00fckenmesi (<code>Connection pool exhausted<\/code>)<\/h3>\n<p>*   <strong>Neden:<\/strong> Veritaban\u0131 ba\u011flant\u0131 havuzunuzdaki t\u00fcm ba\u011flant\u0131lar kullan\u0131l\u0131yor ve yeni ba\u011flant\u0131 iste\u011fi kar\u015f\u0131lanam\u0131yor.<br \/>\n*   <strong>\u00c7\u00f6z\u00fcm:<\/strong><br \/>\n    *   <code>context.xml<\/code> i\u00e7indeki <code>maxActive<\/code> parametresini art\u0131rarak havuzdaki maksimum ba\u011flant\u0131 say\u0131s\u0131n\u0131 art\u0131r\u0131n.<br \/>\n    *   Uygulama kodunuzda ba\u011flant\u0131lar\u0131 d\u00fczg\u00fcn bir \u015fekilde kapat\u0131p kapatmad\u0131\u011f\u0131n\u0131z\u0131 kontrol edin (Hibernate\/JPA kullan\u0131yorsan\u0131z <code>EntityManager<\/code>&#8216;\u0131 <code>close()<\/code> etti\u011finizden emin olun).<br \/>\n    *   Veritaban\u0131 sunucusunun kendisinin de yeterli ba\u011flant\u0131y\u0131 destekleyip desteklemedi\u011fini kontrol edin.<\/p>\n<h3><code>context.xml<\/code> vs <code>server.xml<\/code> nerede kullan\u0131l\u0131r?<\/h3>\n<p>*   <strong><code>context.xml<\/code>:<\/strong> Uygulaman\u0131za \u00f6zel kaynaklar\u0131 tan\u0131mlamak i\u00e7in idealdir. WAR dosyas\u0131 i\u00e7inde <code>META-INF\/context.xml<\/code> olarak paketlenebilir veya Tomcat&#8217;in <code>conf\/Catalina\/localhost\/<\/code> dizinine yerle\u015ftirilebilir. Bu, uygulaman\u0131n ta\u015f\u0131nabilirli\u011fini art\u0131r\u0131r.<br \/>\n*   <strong><code>server.xml<\/code>:<\/strong> T\u00fcm Tomcat uygulamalar\u0131 taraf\u0131ndan eri\u015filebilen genel sunucu kaynaklar\u0131n\u0131 tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r. Genellikle daha az tercih edilir, \u00e7\u00fcnk\u00fc sunucu genelinde de\u011fi\u015fiklikler gerektirir ve uygulama baz\u0131nda \u00f6zelle\u015ftirmeyi zorla\u015ft\u0131r\u0131r.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu makalede, Hibernate, Tomcat ve JNDI DataSource entegrasyonunun modern Java web uygulamalar\u0131nda veritaban\u0131 ba\u011flant\u0131 y\u00f6netimini nas\u0131l optimize etti\u011fini kapsaml\u0131 bir \u015fekilde inceledik. JNDI&#8217;\u0131n sa\u011flad\u0131\u011f\u0131 konfig\u00fcrasyon ayr\u0131m\u0131, merkezi kaynak y\u00f6netimi ve ta\u015f\u0131nabilirlik gibi avantajlar, uygulamalar\u0131n daha sa\u011flam, performansl\u0131 ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flar. Tomcat&#8217;in <code>context.xml<\/code> dosyas\u0131nda DataSource&#8217;u yap\u0131land\u0131rarak ve Hibernate&#8217;in <code>persistence.xml<\/code> veya <code>hibernate.cfg.xml<\/code> dosyalar\u0131nda bu DataSource&#8217;a referans vererek, veritaban\u0131 ba\u011flant\u0131 y\u00f6netimini uygulama sunucusunun sorumlulu\u011funa b\u0131rakm\u0131\u015f oluruz.<\/p>\n<p>\u00d6rnek uygulama ad\u0131mlar\u0131, bu entegrasyonu pratik olarak nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 g\u00f6sterdi. Her ne kadar ba\u015flang\u0131\u00e7ta biraz konfig\u00fcrasyon gerektirse de, JNDI DataSource kullan\u0131m\u0131, \u00f6zellikle kurumsal d\u00fczeydeki uygulamalar i\u00e7in uzun vadede \u00f6nemli faydalar sunar. Geli\u015ftiriciler olarak, bu g\u00fc\u00e7l\u00fc mekanizmalar\u0131 do\u011fru bir \u015fekilde anlamak ve uygulamak, daha iyi mimariye sahip ve y\u00f6netilebilir Java uygulamalar\u0131 olu\u015fturmam\u0131z i\u00e7in kritik \u00f6neme sahiptir. Unutmay\u0131n ki, iyi bir veritaban\u0131 ba\u011flant\u0131 y\u00f6netimi, uygulaman\u0131z\u0131n genel sa\u011fl\u0131\u011f\u0131 ve kullan\u0131c\u0131 deneyimi i\u00e7in temel bir unsurdur.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber\nGiri\u015f\nModern web uygulamalar\u0131, veritabanlar\u0131yla etkile\u015fim kurma ihtiyac\u0131","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-34153","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber Giri\u015f Modern web uygulamalar\u0131, veritabanlar\u0131yla etkile\u015fim kurma ihtiyac\u0131\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-11T22:40:57+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-11-11T22:40:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/\"},\"wordCount\":3023,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/\",\"name\":\"Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-11T22:40:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber","og_description":"Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber Giri\u015f Modern web uygulamalar\u0131, veritabanlar\u0131yla etkile\u015fim kurma ihtiyac\u0131","og_url":"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-11T22:40:57+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber","datePublished":"2025-11-11T22:40:57+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/"},"wordCount":3023,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/","name":"Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-11T22:40:57+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-tomcat-ve-jndi-datasource-kullanimi-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Hibernate, Tomcat ve JNDI DataSource Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34153"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34153\/revisions"}],"predecessor-version":[{"id":34154,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34153\/revisions\/34154"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}