Em um ambiente de aplicativo corporativo típico, aplicativos DB2 geralmente usam as ferramentas SQLJ db2sqljcustomize e db2sqljbind. Essas ferramentas SQLJ chamam programas Java que oferecem o conjunto de ferramentas necessário para customizar e ligar aplicativos SQLJ. No design atual, esses programas Java retornam em seguida para o shell com um código de saída. Isso é feito por meio da chamada System.exit() suportada pela JVM. O valor 0 (zero) indica sucesso, enquanto um código de retorno diferente de zero indica falha no processo de customização ou ligação.
System.exit() significa que a JVM sai e não é adequada para ferramentas de desenvolvimento especiais, como Ant ou Maven, que precisam de uma JVM contínua. No passado, não haveria maneira de fazer trap de System.exit ou da saída da JVM após o processo de customização e ligação. Em tais casos, era preciso executar o aplicativo novamente para continuar com o resto da lógica de negócios. Não haveria problema ao executar os utilitários em um shell script, mas, em uma ferramenta de desenvolvimento especial como Ant, quando o programa Java chama System.exit(), isso pode causar problemas. Por exemplo, se a ferramenta de desenvolvimento, como Ant, operar com um gerenciador de segurança padrão que não faz trap de System.exit
e é executado na mesma JVM que o Ant, ele pode sair após o processo de customização ou ligação.
Neste artigo, faremos um tour pela nova propriedade global do Driver Universal JDBC db2.jcc.sqljToolsExitJVMOnCompletion
e verá como usá-la.
Para usar a nova propriedade global, são necessários:
- Um aplicativo SQLJ simples e perfil serializado SQLJ — Um aplicativo Java com instruções SQL integradas. A tradução de aplicativos SQLJ produz arquivos .class e um ou mais perfis serializados. Ele chama o compilador Java por padrão.
- Um aplicativo JDBC simples — Um aplicativo Java simples contendo ferramentas SQLJ como db2sqljcustomize e db2sqljbind.
- Driver Universal DB2 IBM para SQLJ e JDBC — O Driver Universal é com.ibm.db2.jcc.DB2Driver e está contido em db2jcc.jar. O sqlj.zip contém o tradutor SQLJ.
- Arquivo de propriedade global DB2JccConfiguration.properties
— Este arquivo de recursos é usado para configurar a propriedade
db2.jcc.sqljToolsExitJVMOnCompletion. A propriedade pode ser configurada em DB2Configuration.properties ou passada por meio de-Dpara o comando Java. Há outras maneiras de configurar a propriedade. Consulte a seção do Centro de Informações sobre Customização de IBM Data Server Driver para JDBC e propriedades de configuração SQLJ.
Vantagens da nova propriedade JCC
A nova propriedade global JCC db2.jcc.sqljToolsExitJVMOnCompletion tem um tipo de retorno booleano. O valor padrão para essa propriedade é verdadeiro, o que significa que todas as ferramentas SQLJ chamarão System.exit() ao concluírem. Para fazer trap de System.exit() após a execução das ferramentas SQLJ, é preciso configurar o valor da propriedade como falso: db2.jcc.sqljToolsExitJVMOnCompletion=false.
Havendo ou não um erro, por padrão, a JVM sairá quando System.exit for chamado. A execução de ferramentas SQLJ chama System.exit independentemente de erros. Quando a propriedade é configurada como falsa, o shell recebe um código de retorno 0 mesmo em caso de falha da customização. É possível usar customizeMain programaticamente para obter um código de retorno do método.
Se o valor da propriedade for definido como db2.jcc.sqljToolsExitJVMOnCompletion=false e houver um erro no processo de customização ou ligação, o código de retorno da aplicação será 0.
Se o valor da propriedade for definido como db2.jcc.sqljToolsExitJVMOnCompletion=true e houver um erro no processo de customização ou ligação, o código de retorno do aplicativo será um valor diferente de zero.
Caso de uso e configuração do aplicativo de amostra
Etapa 1: Definindo o caminho de classe
Não se esqueça de colocar os arquivos JAR do Driver Universal db2jcc.jar e sqlj.zip no caminho de classe.
Etapa 2: Criando um aplicativo SQLJ simples
Este aplicativo SQLJ se conecta a um banco de dados com o objeto de origem de dados ds e busca as linhas da tabela Employee existente com o agente iterativo posicionado ByPos.
Lista 1. Programa SQLJ buscando linhas em uma tabela existente
import java.sql.*;
// Create connection context class DB2Connect
#sql context DB2Connect;
// Declare positioned iterator ByPos
#sql iterator ByPos(String,int);
public class sqljapp {
public static void main(String[] args) throws Exception
{
// Create a DataSource object ds
javax.sql.DataSource ds =
new com.ibm.db2.jcc.DB2SimpleDataSource();
((com.ibm.db2.jcc.DB2BaseDataSource) ds).
setServerName("localhost");
((com.ibm.db2.jcc.DB2BaseDataSource) ds).
setPortNumber(50000);
((com.ibm.db2.jcc.DB2BaseDataSource) ds).
setDatabaseName("SAMPLE");
((com.ibm.db2.jcc.DB2BaseDataSource) ds).
setDriverType(4);
java.sql.Connection con =
ds.getConnection("administrator", "passwd");
// Creating connection context object db2con
DB2Connect db2con = new DB2Connect(con);
// Declare the object of ByPos class
ByPos positer;
// Use db2con for executing an SQL statement
#sql[db2con] positer= { select * from EMPLOYEE };
}
}
|
Etapa 3: Traduzindo o aplicativo SQLJ
Traduzir o aplicativo gera um arquivo de origem Java padrão e um perfil serializado SQLJ (sqljapp_SJProfile0.ser).
Lista 2. Tradução do programa SQLJ
C:\jcc_home3\jcc>sqlj sqljapp.sqlj |
Etapa 4: Executando o aplicativo Java
Este é um aplicativo Java simples, no qual parâmetros são passados para o utilitário de customização. O aplicativo Java é executado em uma única JVM sem uma propriedade nova. O aplicativo deve sair para o responsável pela chamada com o código de retorno usando o System.exit(). O código de retorno será 0 se a customização for executada com sucesso. O aplicativo não deve chamar nenhum código (a função fun_checkJVM) após concluir o utilitário db2sqljcustomize.
Lista 3. Aplicativo Java sem usar a propriedade
db2.jcc.sqljToolsExitJVMOnCompletion
public class JVMexit {
public static void main(String a[]) throws Exception {
// Array of String as parameters to db2sqljcustomize
String[] cmd = { "-url", "jdbc:db2://localhost:50000/SAMPLE",
"-user","administrator", "-password", "passwd", "-onlinecheck",
"YES", "-rootPkgName", "BCB", "-collection", "COL18",
"-tracefile", "trace_cust.txt", "-tracelevel", "TRACE_ALL",
"sqljapp_SJProfile0.ser" };
// Create an object of db2sqljcustomize
com.ibm.db2.jcc.sqlj.Customizer cust = new
com.ibm.db2.jcc.sqlj.Customizer();
// Execute the db2sqljcustomize with arguements
cust.main(cmd);
/* Function to check if JVM exited or not,if exited it will not call
below function or else it will. */
fun_checkJVM();
}
private static void fun_checkJVM() {
System.out.println("JVM didn't exit");
}
}
|
Até agora, foi possível ver como executar o aplicativo Java em uma única JVM sem usar a nova propriedade global. (O valor padrão da propriedade é true — db2.jcc.sqljToolsExitJVMOnCompletion=true). Agora, vamos examinar um cenário no qual o valor da propriedade pode ser definido como db2.jcc.sqljToolsExitJVMOnCompletion=false no arquivo de propriedades globais DB2JccConfiguration.properties para executar o mesmo aplicativo Java.
Etapa 5: Arquivo global DB2JccConfiguration.properties
Crie um arquivo de recursos chamado DB2JccConfiguration.properties, coloque-o no caminho de classe e inclua a propriedade, conforme mostrado abaixo.
Lista 4. DB2JccConfiguration.properties
//Add the property value as false in file db2.jcc.sqljToolsExitJVMOnCompletion=false |
Etapa 6: Executar o aplicativo Java
O aplicativo irá executar o código após a conclusão do processo de customização. A função fun_checkJVM() será chamada, o que prova que o aplicativo não chamou System.exit() após a conclusão do processo de customização.
Agora, veja um cenário no qual o aplicativo Java inteiro deve ser executado com um erro no processo de customização. Ao configurar o valor da propriedade como falso (db2.jcc.sqljToolsExitJVMOnCompletion=false), é possível fazer isso também.
Etapa 7: Executar o aplicativo Java incluindo parâmetros errados
No exemplo de execução de um aplicativo com parâmetros errados, um erro existe no customizador/processo de ligação, apesar de o aplicativo chamar function fun_checkJVM(), o que prova que o aplicativo não chama System.exit() após a conclusão do processo de customização.
Lista 5. Aplicativo Java incluindo parâmetros errados
public class JVMexit {
public static void main(String a[]) throws Exception {
// Array of String with wrong port # as parameter to db2sqljcustomize
String[] cmd = { "-url", "jdbc:db2://localhost:5000/SAMPLE",
"-user","administrator", "-password", "passwd", "-onlinecheck",
"YES", "-rootPkgName", "BCB", "-collection", "COL18",
"-tracefile", "trace_cust.txt", "-tracelevel", "TRACE_ALL",
"sqljapp_SJProfile0.ser" };
// Create an object of db2sqljcustomize
com.ibm.db2.jcc.sqlj.Customizer cust = new
com.ibm.db2.jcc.sqlj.Customizer();
// Execute the db2sqljcustomize with arguments
cust.main(cmd);
/* Function to check if JVM exited or not,if exited it will not call
below function or else it will. */
fun_checkJVM();
}
private static void fun_checkJVM() {
System.out.println("JVM didn't exit");
}
}
|
Neste artigo, mostramos como é possível usar a nova propriedade db2.jcc.sqljToolsExitJVMOnCompletion para fazer trap de System.exit() após a conclusão de ferramentas SQLJ, como customização e ligação. Quando o valor da propriedade é configurado como falso, o aplicativo não sai da JVM, mesmo que haja um erro na execução das ferramentas SQJL, e é possível continuar com a execução do aplicativo.
Aprender
- Consulte a seção do Centro de Informações sobre db2sqljcustomize e db2sqljbind
para mais informações sobre essas ferramentas.
- Saiba mais sobre a Customização de IBM Data Server Driver para JDBC e configurações de propriedade SQLJ no Information Center.
- Saiba mais sobre o DB2 em DB2 para Linux, UNIX e Windows no developerWorks.
- Saiba mais sobre o desenvolvimento de aplicativos Java com DB2.
- Saiba mais sobre Information Management na zona de Information Management no developerWorks. Encontre documentações técnicas, artigos de instruções, treinamento, downloads, informações de produtos e muito mais.
- Fique por dentro dos
eventos técnicos e webcasts do developerWorks.
- Siga o developerWorks no Twitter.
Obter produtos e tecnologias
- Crie seu próximo projeto de desenvolvimento com a
versão de testes do software IBM,
disponível para download diretamente no developerWorks.
Discutir
- Participar do fórum de discussão.
- Confira os
blogs do developerWorks e participe da
comunidade do developerWorks.

Sujan Ghosh has been a software engineer at the IBM lab in India for more than four years as a member of the DB2 Java common connectivity and pureQuery client optimization team. Most of his projects have been based on DB2 and Java technology. He is an IBM Certified Database Administrator for DB2 for Linux, UNIX, and Windows, and an IBM Certified Solution Developer for XML.