- Katılım
- 7 Nis 2025
- Konular
- 367
- Mesajlar
- 780
- Çözümler
- 1
- Tepkime puanı
- 121
- Puan
- 93
- Konum
- İstanbul
- Web sitesi
- forumagel.com
Veritabanları, genellikle tek başlarına kullanılmazlar; web siteleri, masaüstü uygulamaları, mobil uygulamalar veya arka plan hizmetleri gibi çeşitli uygulamalar tarafından erişilir ve yönetilirler. Bu uygulamaların veritabanındaki verilere ulaşabilmesi için veritabanı sunucusuna bir bağlantı kurması ve bu bağlantı üzerinden SQL komutları göndermesi gerekir. Bu bölümde, bir uygulamanın veritabanıyla nasıl etkileşim kurduğunun temel prensiplerini ele alacağız.
Bağlantı Kurma Süreci
Bir uygulamanın veritabanına bağlanma süreci genellikle şu adımları içerir:
Bağlantı dizeleri, veritabanına bağlanmak için gereken tüm bilgileri içeren metin dizeleridir. Sözdizimi kullanılan DBMS'e, sürücüye ve programlama diline göre büyük ölçüde değişir, ancak genellikle şu bilgileri içerir:
Veritabanı ile Etkileşim Yöntemleri
Uygulama kodunda veritabanı ile etkileşim kurmanın birkaç yaygın yolu vardır:
Veritabanı bağlantısı kurmak maliyetli bir işlemdir. Her kullanıcı isteği için yeni bir bağlantı açıp kapatmak performansı olumsuz etkiler. Bağlantı Havuzlama, uygulamaların belirli sayıda veritabanı bağlantısını önceden açıp bir "havuzda" hazır tutmasını sağlayan bir tekniktir. Bir bağlantıya ihtiyaç duyulduğunda havuzdan alınır, işi bitince havuza geri döner. Bu, bağlantı açma/kapatma maliyetini ortadan kaldırarak performansı ve veritabanı kaynak kullanımını optimize eder. Modern uygulama çerçeveleri ve veritabanı sürücüleri genellikle bağlantı havuzlamayı destekler veya yerleşik olarak sunar.
Sonuçları İşleme ve Hata Yönetimi
Veritabanından veri çekildiğinde, sonuç genellikle satır ve sütunlardan oluşan bir yapı (result set) olarak alınır. Uygulama kodu bu sonuç kümesi üzerinde döngü kurarak verilere erişir. Hata durumlarında (bağlantı hatası, sorgu hatası, kısıtlama ihlali vb.), uygulama kodunda uygun hata yakalama (
Bu bölümde, uygulamaların veritabanlarına nasıl bağlandığına, veriyle etkileşim kurmanın farklı yollarına (Ham SQL, Parametreli Sorgular, ORM) ve bağlantı havuzlama gibi konulara temel bir bakış attık.
Veritabanı işlemleri sıklıkla birbiriyle ilişkili adımlardan oluşur ve bu adımların ya hep birlikte başarılı olması ya da hiç olmaması istenir. Bu kavram, Transactionlar (İşlemler) olarak adlandırılır.
Bir sonraki bölümde, veritabanı transactionlarının ne olduğunu, ACID prensiplerini ve uygulamalardan transactionları nasıl yöneteceğimizi daha detaylı olarak inceleyebiliriz.
Bağlantı Kurma Süreci
Bir uygulamanın veritabanına bağlanma süreci genellikle şu adımları içerir:
- Veritabanı Sürücüsü/API'si: Her programlama dili veya platform, farklı veritabanı sistemlerine bağlanmak için özel sürücülere veya API'lere (Uygulama Programlama Arayüzü) ihtiyaç duyar. Bu sürücüler, uygulamanın veritabanı sunucusuyla iletişim kurmasını sağlayan köprü görevi görür. (Örn: JDBC for Java, .NET Data Providers for C#, Psycopg2 for PostgreSQL in Python, MySQL Connector for MySQL.)
- Bağlantı Parametreleri (Connection String): Uygulama, veritabanı sunucusuna nasıl bağlanacağını belirten bir dizi bilgiye ihtiyaç duyar. Bu bilgiler genellikle bir "bağlantı dizesi" (connection string) formatında veya ayrı parametreler olarak sağlanır.
- Bağlantı Açma: Uygulama kodu, sağlanan bağlantı parametrelerini kullanarak sürücü aracılığıyla veritabanı sunucusuna bir bağlantı açma isteği gönderir.
- Kimlik Doğrulama: Veritabanı sunucusu, gelen bağlantı isteğini doğrular (kullanıcı adı, şifre vb. kontrol edilir - Bölüm 11). Başarılı olursa bağlantı kurulur.
- İletişim: Bağlantı kurulduktan sonra, uygulama bu bağlantı üzerinden veritabanına SQL komutları gönderebilir ve sonuçları alabilir.
- Bağlantı Kapatma: Uygulama veritabanı ile işi bittiğinde, kaynakları serbest bırakmak için bağlantıyı kapatmalıdır.
Bağlantı dizeleri, veritabanına bağlanmak için gereken tüm bilgileri içeren metin dizeleridir. Sözdizimi kullanılan DBMS'e, sürücüye ve programlama diline göre büyük ölçüde değişir, ancak genellikle şu bilgileri içerir:
- Sunucu Adresi/IP'si
- Port Numarası
- Veritabanı Adı
- Kullanıcı Adı
- Şifre
- Ek Seçenekler (Zaman aşımı, SSL kullanımı vb.)
Kod:
Server=https://www.google.com/search?q=veritabani.sunucu.com;Port=5432;Database=uygulama_db;User Id=kullanici;Password=sifre;
Veritabanı ile Etkileşim Yöntemleri
Uygulama kodunda veritabanı ile etkileşim kurmanın birkaç yaygın yolu vardır:
- Ham SQL Komutları (
Raw SQL
): SQL komutlarını doğrudan metin dizeleri olarak yazıp veritabanına gönderilir.Kod:-- Uygulama kodunda bir örnek (sözdizimi temsili)sql_sorgusu = "SELECT * FROM Musteriler WHERE Sehir = 'Ankara';"sonuclar = veritabani_baglantisi.execute(sql_sorgusu);
- Avantajı:* Tam SQL kontrolü.
- Dezavantajları:* SQL Injection zafiyetine açık olabilir (kullanıcı girdilerini doğrudan sorguya eklemek). Sorguları yönetmek ve okumak büyük uygulamalarda zorlaşabilir.
- Parametreli Sorgular (
Parameterized Queries
/Prepared Statements
): SQL komutu yapısı (şablonu) veriden ayrı tutulur. Veri değerleri, komut çalıştırılırken ayrı parametreler olarak verilir.Kod:-- Uygulama kodunda bir örnek (sözdizimi temsili)sql_sorgusu_sablonu = "SELECT * FROM Musteriler WHERE Sehir = ?;" -- veya :sehir, @sehir gibi işaretleyicilersehir_degeri = "Ankara";sonuclar = veritabani_baglantisi.execute(sql_sorgusu_sablonu, [sehir_degeri]);
- Avantajları:* SQL Injection'a karşı güvenlidir çünkü veri ve komut ayrı işlenir. Bazı durumlarda veritabanı bu şablonu önbelleğe alarak performansı artırabilir. Kod daha okunabilir olabilir.
- Kesinlikle önerilen yöntemdir!
- Nesne-İlişkisel Eşleyiciler (
Object-Relational Mappers - ORM
): Veritabanı tablolarını uygulama kodundaki nesnelerle eşleyen bir soyutlama katmanıdır. Veritabanı işlemleri SQL yazmak yerine nesne odaklı kod ile yapılır, ORM bu kodu otomatik olarak SQL'e çevirir.
- Örnekler: Python için
SQLAlchemy
, .NET içinEntity Framework
, Java içinHibernate
, Node.js içinSequelize
. -
Kod:
-- ORM ile örnek (kavramsal)musteriler = db_context.Musteriler.Where(m => m.Sehir == "Ankara").ToList();
- Avantajları:* Geliştirme hızını artırabilir, farklı veritabanları arasında geçişi kolaylaştırabilir (ORM destekliyorsa), kodun daha nesne odaklı olmasını sağlar. Parametreli sorguları otomatik olarak kullanır.
- Dezavantajları:* Bazı karmaşık SQL sorgularını yazmak zor olabilir, ORM'in ürettiği SQL bazen verimsiz olabilir (performans sorunlarına yol açabilir), öğrenme eğrisi olabilir.
- Örnekler: Python için
Veritabanı bağlantısı kurmak maliyetli bir işlemdir. Her kullanıcı isteği için yeni bir bağlantı açıp kapatmak performansı olumsuz etkiler. Bağlantı Havuzlama, uygulamaların belirli sayıda veritabanı bağlantısını önceden açıp bir "havuzda" hazır tutmasını sağlayan bir tekniktir. Bir bağlantıya ihtiyaç duyulduğunda havuzdan alınır, işi bitince havuza geri döner. Bu, bağlantı açma/kapatma maliyetini ortadan kaldırarak performansı ve veritabanı kaynak kullanımını optimize eder. Modern uygulama çerçeveleri ve veritabanı sürücüleri genellikle bağlantı havuzlamayı destekler veya yerleşik olarak sunar.
Sonuçları İşleme ve Hata Yönetimi
Veritabanından veri çekildiğinde, sonuç genellikle satır ve sütunlardan oluşan bir yapı (result set) olarak alınır. Uygulama kodu bu sonuç kümesi üzerinde döngü kurarak verilere erişir. Hata durumlarında (bağlantı hatası, sorgu hatası, kısıtlama ihlali vb.), uygulama kodunda uygun hata yakalama (
try-catch
blokları gibi) mekanizmaları kullanarak hataları ele almak ve kullanıcıya bilgi vermek önemlidir.Bu bölümde, uygulamaların veritabanlarına nasıl bağlandığına, veriyle etkileşim kurmanın farklı yollarına (Ham SQL, Parametreli Sorgular, ORM) ve bağlantı havuzlama gibi konulara temel bir bakış attık.
Veritabanı işlemleri sıklıkla birbiriyle ilişkili adımlardan oluşur ve bu adımların ya hep birlikte başarılı olması ya da hiç olmaması istenir. Bu kavram, Transactionlar (İşlemler) olarak adlandırılır.
Bir sonraki bölümde, veritabanı transactionlarının ne olduğunu, ACID prensiplerini ve uygulamalardan transactionları nasıl yöneteceğimizi daha detaylı olarak inceleyebiliriz.