Database Connection'larıDatabase Connections
TROIA Platformu, TROIA seviyesinde database operation'larını yönetmek için login sırasında bir database connection kurar. Ayrıca, TROIA ile farklı database sistemleri arasında data transfer gibi multi-database operation'ları için birden fazla database connection kurmak ve yönetmek mümkündür. Bu bölüm, birden fazla database ile nasıl çalışılacağını ve db transaction'larının nasıl yönetileceğini açıklamayı amaçlar.TROIA Platform establishes a database connection while logging in to manage TROIA level database operations. Moreover, it is possible to establish and manage multiple database connections for multi-database operations such as data transfer between different database systems with TROIA. This section aims to explain how to work with multiple databases and manage db transactions.
TROIA'da DB Connection TemelleriBasics of DB Connection In TROIA
DB Configuration'ları ve LoginDB Configurations and Login
Database configuration'ları ve database ile ilgili login parametreleri doğrudan TROIA Programming ile ilgili değildir. Ancak database connection'ın tüm sürecini anlamak önemlidir. Application server aracılığıyla yapılabilecek tüm database connection'larının bilgisi, server configuration (settings) dosyasının [Databases] bölümünde tanımlanır. Her connection bilgisinin, onu diğerlerinden ayıran benzersiz bir id'si vardır. Bu id, DBServer ve DBName olmak üzere iki parçadan oluşur.Database configurations and database related login parameters are not directly related to TROIA Programming. But it is important to understand the whole process of database connection. The information of all database connections that can be made through the application server are defined in the [Databases] section of server configuration (settings) file. Each connection information has an unique id that distinguishes it from the other. This id consists of two parts, DBServer and DBName.
Bir kullanıcı sisteme login olduğunda, sistem önce kullanıcının login parametrelerinden DBServer ve DBName parametrelerini kullanarak database configuration'ını bulur, ardından bu configuration'ı database connection için kullanır.When a user logs in the system, system firstly finds database configuration using DBServer and DBName parameters from user’s login parameters and then uses this configuration for database connection.
Default DB ConnectionDefault DB Connection
Application server, aynı configuration'ı kullanarak aynı database'e iki farklı database connection kurar. Bu nedenle; olağan durumlarda, TROIA programcılarının query çalıştırmak için database'e bağlanmak amacıyla herhangi bir işlem yapmasına gerek yoktur, TROIA seviyesinde herhangi bir çaba gerekmeden otomatik olarak kullanıma hazır hale gelir. Bu connection'ları kapatmak için de aynı şey geçerlidir, tamamen interpreter tarafından yönetilir ve kullanıcı logout olurken kapatılır.Application server establishes two different database connections to same database using same configuration. Therefore; in ordinary cases, TROIA programmers do not need to make any operation to connect database to run queries, it automatically gets ready for TROIA programmers use without any TROIA level effort. It is also same for closing these connections, it is totally handled by the interpreter and closed while user logging out.
Bu iki connection, TROIA terminolojisinde (jargonunda) "first database connection" ve "second database connection" olarak adlandırılır ve farklı amaçları vardır. First database connection, TROIA operation'larına atanmıştır. Başka bir deyişle, application'ınız bir SELECT statement'ı içeriyorsa, sistem select query'sini first database connection kullanarak çalıştırır. Tüm TROIA seviyesi SQL komutları first database connection'ı kullanır.This two connections are called “first database connection” and “second database connection” in TROIA terminology (jargon) and they have different purposes. First database connection is assigned to TROIA operations. In other words if your application contains a SELECT statement, system runs select query using first database connection. All TROIA level SQL commands uses first database connection.
Second database connection, log ekleme, transaction'ın first dialog'unu alma gibi interpreter seviyesi database operation'ları için atanmıştır. Second database connection kullanarak data manipulation (SELECT, UPDATE, INSERT, DELETE) ve data definition (CREATE, ALTER vb.) query'lerini çalıştırmak mümkün değildir, ancak ENQUE, DEQUE gibi bazı özel troia komutları çalıştırılabilir. Bu yüzden bir TROIA programcısı olarak second database connection'ı görmezden gelebilirsiniz.Second database connection is assigned for interpreter level database operations like inserting logs, gathering transaction’s first dialog etc. It is not possible to run data manipulation (SELECT, UPDATE, INSERT, DELETE) and data definition (CREATE, ALTER etc.) queries using second database connection, but some special troia commands like ENQUE, DEQUE. Therefore you can just ignore second database connection as a TROIA programmer.
DB Connection Session'a AittirDB Connection Belongs to Session
Tahmin edebileceğiniz gibi, database connection kullanıcının session'ının bir property'si veya feature'ıdır, bu yüzden kullanıcı birden fazla transaction açsa bile tüm transaction'lar aynı database connection'ı kullanır. Bu, database connection'ın tüm açık transaction'lar tarafından paylaşıldığı anlamına gelir ve bir session connection'ın state'ini veya feature'ını değiştirirse bu state/feature diğer transaction'lar için de geçerlidir. Aslında bu, farklı transaction'larda birden fazla process'i aynı anda çalıştırmanın neden mümkün olmadığının ana teknik nedenlerinden biridir. Multithreading gibi bazı özel durumlar için, her transaction için dedicated database connection kurmak mümkündür. Bu ileri düzey konuyu ilerleyen bölümlerde ele alacağız, ancak şimdilik transaction'lar için dedicated database connection'ları görmezden gelebilirsiniz.As you may predict, database connection is a property or feature of user’s session, so even if user opens more than one transaction all transactions uses same database connection. This means database connection is shared by all open transactions, and if a session changes state or a feature of connection this state/feature is valid for other transactions. Actually this is one of the main technical reasons of why it is not possible to run more than one processes on different transactions simultaneously. For some special cases like multithreading, it is possible to establish dedicated database connections for each transaction. We will discuss this advanced issue in next sections, but for now you can just ignore dedicated database connections for transactions.
Kısacası, sistem kullanıcı login olduğunda tüm açık TROIA application'larına hizmet etmek için otomatik olarak bir database connection kurar ve tüm SELECT, UPDATE, INSERT ve DELETE komutları bu database connection'ı kullanır.Briefly, system automatically establishes a database connection on user login to serve for all open TROIA applications and all SELECT, UPDATE, INSERT and DELETE commands uses this database connection.
Farklı Database'lere BağlanmaConnecting Different Databases
Bağlanma / Bağlantıyı KesmeConnecting / Disconnecting
Default connection dışında bir database üzerinde database operation'ları gerçekleştirmek için custom bir database connection kurmanız gerekir. Bu durumda connect ve disconnect operation'ları TROIA Programcısı tarafından gerçekleştirilir, bu yüzden db operation'larından sonra connection'ı kapatmak TROIA code'unun sorumluluğundadır.To perform database operations on a database other than default connection you have to establish a custom database connection. In this case connect and disconnect operations are performed by TROIA Programmer, so closing connection after db operations is in the responsibility of TROIA code.
Bir database'e bağlanmak için MAKENEWCONNECTION komutunu, database connection'ı kapatmak için CLOSECONNECTION komutunu kullanabilirsiniz. Tahmin edebileceğiniz gibi, MAKENEWCONNECTION komutu database configuration satırının id'sini ve yeni connection için bir isim alır. CLOSECONNECTION komutu connection'ı kapatmak için yalnızca connection ismini alır. İşte komutların temel syntax'ları.To connect a database you can use MAKENEWCONNECTION command, and CLOSECONNECTION command to close database connection. As you may predict, MAKENEWCONNECTION command gets the id of the database configuration line and a name for the new connection. CLOSECONNECTION command gets only connection name to close connection. Here are the basic syntaxes of the commands.
MAKENEWCONNECTION {connectionname} {user} {passw} {dbserver} {dbname};
CLOSECONNECTION {connectionname};
//{user} and {passw} parameters are totally ignored, they are just for backward compatibility.
//{dbserver} and {dbname} are used to match a db configuration line in server config file.Bir database configuration tanımlamadan MAKENEWCONNECTION'ın ek syntax'larıyla da bunu yapmak mümkündür, ancak bu kitapta bu seçeneği tamamen göz ardı edeceğiz, daha fazla bilgi için lütfen TROIA'nın help dokümanlarına bakınız. Her iki komut da bağlanma ve bağlantı kesme sürecinde bir sorunla karşılaşırlarsa SYS_STATUS ve SYS_STATUSERROR'ı ayarlar.It is also possible without defining a database configuration with additionaly syntaxes of MAKENEWCONNECTION, but in this book we will totally ignore this option, for more information please see help documents of TROIA. Both commands sets SYS_STATUS and SYS_STATUSERROR if they encounters a problem while connecting and disconnecting process.
Connection'lar Arasında Geçiş YapmaSwitching Between Connections
Bir database connection kurduğunuzda, sadece verilen isimle yeni bir connection tanımlarsınız ama sql statement'larınız hâlâ default connection'ı kullanır. Yeni connection'ınızda query çalıştırmak için, db connection'ınızı aktive etmeniz gerekir. Default connection ile custom connection'ınız arasında geçiş yapmak için SETACTIVECONNECTION komutu kullanılır. Database connection'ınızı değiştirdikten sonra, session'daki tüm transaction'lar bu aktif connection'ı kullanır, database aktive edilmeden önce zaten açılmış olsalar bile.When you establish a database connection, you just define a new connectiong with given name but your sql statements still uses default connection. To run queries on your new connection, you have to activate your db connection. SETACTIVECONNECTION command is used to switch between default connection and your custom connection. After you switch your database connection, active connection is used by all transactions in session even they are already opened before activating database.
İşte komutun syntax'ı:Here is the syntax for the command:
SETACTIVECONNECTION {connectionname};
SETACTIVECONNECTION DEFAULT;İşte default configuration ile custom connection arasında geçiş yapan örnek bir kod. Bu kodda "SELECT A" ve "SELECT C" default database configuration'ında gerçekleştirilir. "SELECT B", DBSERVER1.ARCHIVEDB'ye bağlı custom connection üzerinde gerçekleştirilir. Bu örnek koddaki gibi, database connection'ı kapatmadan önce default connection'a geçiş yapmalısınız.Here is a sample code, that switch between default configuration and custom connection. In this code “SELECT A” and “SELECT C” are performed in default database configuration. “SELECT B” is performed on custom connection which is connected to DBSERVER1.ARCHIVEDB. Like in this sample code, you must switch to default connection, before closing database connection.
OBJECT:
STRING CONNECTIONNAME;
CONNECTIONNAME = 'NewConnection';
MAKENEWCONNECTION CONNECTIONNAME XXX XXX DBSERVER1 ARCHIVEDB;
IF SYS_STATUS THEN
STRINGVAR3 = SYS_STATUSERROR;
ELSE
/*SELECT A*/
SELECT * FROM USERACCOUNTS INTO ACCOUNTS;
SETACTIVECONNECTION CONNECTIONNAME;
/*SELECT B*/
SELECT * FROM USERACCOUNTS INTO ACCOUNTS;
SETACTIVECONNECTION DEFAULT;
/*SELECT C*/
SELECT * FROM USERACCOUNTS INTO ACCOUNTS;
CLOSECONNECTION CONNECTIONNAME;
ENDIF;Aşağıdaki grafik, program cursor'ı "SELECT B" satırındayken database connection state'ini gösterir. MAKENEWCONNECTION komutu "NewConnection1" isimli yeni bir database connection ekler ve SETACTIVECONNECTION komutu aktif database cursor'ını "NewConnection1"e taşır.The graph below, illustrates database connection state while program cursor on “SELECT B” line. MAKENEWCONNECTION command adds a new database connection with “NewConnection1” name and SETACTIVECONNECTION command moves active database cursor to “NewConnection1”.
Birden Fazla Custom ConnectionMultiple Custom Connections
Bu yaklaşımla, bir veya daha fazla custom connection oluşturmak ve sadece aktif database connection'ı yöneterek iki custom connection arasında data transfer etmek mümkündür. Bu durumda "SELECT A" DBSERVER1.ARCHIVEDB üzerinde, "SELECT B" DBSERVER2.ARCHIVEDB üzerinde ve "SELECT C" default database üzerinde gerçekleştirilir.With this approach, it is possible to create one or more custom connections and transfer data between two custom connections, with just managing active database connection. In this case “SELECT A” is performed on DBSERVER1.ARCHIVEDB, “SELECT B” is performed on DBSERVER2.ARCHIVEDB and “SELECT C” is performed on default database.
OBJECT:
STRING C1,
STRING C2;
C1 = 'NewConnection1';
C2 = 'NewConnection2';
MAKENEWCONNECTION C1 XXX XXX DBSERVER1 ARCHIVEDB;
MAKENEWCONNECTION C2 XXX XXX DBSERVER2 ARCHIVEDB;
SETACTIVECONNECTION C1;
/*SELECT A*/
SELECT * FROM USERACCOUNTS INTO ACCOUNTS;
SETACTIVECONNECTION C2;
/*SELECT B*/
SELECT * FROM USERACCOUNTS INTO ACCOUNTS;
SETACTIVECONNECTION DEFAULT;
/*SELECT C*/
SELECT * FROM USERACCOUNTS INTO ACCOUNTS;
CLOSECONNECTION C1;
CLOSECONNECTION C2;
/* In this example SYS_STATUS checks
are ignored to make the code easier. */Birden Fazla Connection'da DB Transaction'larını YönetmeManaging DB Transactions on Mulptiple Connections
BEGINTRAN / COMMITTRAN / ROLLBACKTRAN komutları aktif database üzerinde gerçekleştirilir ve SYS_INDBTRANSACTION variable'ı aktif database için transaction status'unu döndürür. Bu yüzden aşağıdaki kodda, ilk BEGINTRAN komutu default database'de bir db transaction başlatır ve ikinci BEGINTRAN komutu "C1" connection'ında db transaction başlatır. Benzer şekilde, ilk COMMITTRAN komutu "C1" için, ikincisi default connection için çalışır. "Block A"da SYS_INDBTRANSACTION'ın değeri true'dur, ama "Block B"de false'tur. Daha iyi anlamak için diğer block'larda SYS_INDBTRANSACTION'ın değerini tartışabilirsiniz.BEGINTRAN / COMMITTRAN / ROLLBACKTRAN commands are performed on active database and SYS_INDBTRANSACTION variable returns transaction status for the active database. So in the code below, first BEGINTRAN command starts a db transaction in default database and the second BEGINTRAN command starts db transaction on “C1” connection. Likewise, first COMMITTRAN command is works for “C1” and second one works for default connection. In “Block A” value of SYS_INDBTRANSACTION is true, but it is false in “Block B”. You can discuss the value of SYS_INDBTRANSACTION in other blocks to understand better.
OBJECT:
STRING CONNECTIONNAME;
CONNECTIONNAME = 'C1';
MAKENEWCONNECTION CONNECTIONNAME XXX XXX DBSERVER1 ARCHIVEDB;
BEGINTRAN;
/* Block A */
SETACTIVECONNECTION CONNECTIONNAME;
/* Block B */
BEGINTRAN;
/* Block C */
COMMITTRAN;
/* Block D */
SETACTIVECONNECTION DEFAULT;
/* Block E */
COMMITTRAN;
CLOSECONNECTION CONNECTIONNAME;Transaction'lar için Dedicated Database Connection'larıDedicated Database Connections for Transactions
Varsayılan olarak, database connection tüm transaction'lar tarafından paylaşılır, bu yüzden bir transaction için dedicated bir connection yoktur. Ama multithreading gibi bazı durumlarda, programcıların shared source'ları azaltmak ve thread'leri kolayca yönetmek için dedicated bir database connection'a ihtiyacı olabilir. Bu tür özel durumlar dışında dedicated bir connection oluşturmak önerilmez. Bir transaction için dedicated bir database oluşturma hakkında daha fazla bilgi için, lütfen multithreading ile ilgili bölümü inceleyin.As default, database connection is shared by all transactions, so there is not a dedicated connection for a transaction. But in some cases such as multithreading, programmers may need a dedicated database connection to reduce shared sources and manage threads easily. It is not recommended to create a dedicated connection except these kind of special cases. For more information about creating a dedicated database for a transaction, please review the section releated with multithreading.