Lotus и MySQL (jdbc)

13.03.2009
625
1
#1
вроде работающий агент:

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Код"</div></div><div class="sp-body"><div class="sp-content">
Код:
import lotus.domino.*;
import java.util.Vector;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

public class JavaAgent extends AgentBase {

public void NotesMain() {

try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// (Your code goes here) 
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;

try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
} catch (Exception ex) {
System.out.println("SQLException: " + ex.getMessage());

}


try {
conn = DriverManager.getConnection("jdbc:mysql://server/dbname?user=USER&password=PASSWORD");
} catch (SQLException ex) {
System.out.println("On connect SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
System.out.println("Connection Created");
try {
stmt = conn.createStatement();
// Создаем временные таблицы
// 1. Наличие товара на складах по датам
String cutOffDate = "2006-10-16"; // дата отсечения
String tmpTableQuery = "CREATE TEMPORARY TABLE T1(guid integer, storeuid integer, days integer) SELECT guid, storeuid, count(distinct(storedate)) AS days FROM stores WHERE storedate>'"+cutOffDate+"' GROUP BY guid, storeuid ";
try {
stmt.executeUpdate(tmpTableQuery);
} catch(SQLException ex) {
System.out.println("Creating t1... SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
// 2. Текущее состояние складов
tmpTableQuery = "CREATE TEMPORARY TABLE T2(guid integer, storeuid integer, amount integer) SELECT guid,storeuid, sum(amount) AS amount FROM stores WHERE storedate = (SELECT MAX(storedate) FROM stores) GROUP BY guid, storeuid";
try {
stmt.executeUpdate(tmpTableQuery);
} catch(SQLException ex) {
System.out.println("Creating t2... SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
// 3. Продажи по датам
tmpTableQuery = "CREATE TEMPORARY TABLE T3(guid integer, storeuid integer, amount integer) SELECT guid, storeuid, sum(amount) AS amount FROM buystore WHERE indoccreatedate>'"+cutOffDate+"' GROUP BY guid, storeuid";
try {
stmt.executeUpdate(tmpTableQuery);
} catch(SQLException ex) {
System.out.println("Creating t3... SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
// ацкий JOIN
String joinQuery = "SELECT t1.*,goodslist.goodname, IFNULL(t2.amount,0) AS onstore, IFNULL(t3.amount,0) AS sold, ";
joinQuery = joinQuery + "IFNULL(t3.amount,0)/t1.days AS avrg, IFNULL(t3.amount,0)/t1.days-IFNULL(t2.amount,0) AS ness FROM t1 ";
joinQuery = joinQuery + "LEFT JOIN t2 ON t1.guid=t2.guid AND t1.storeuid=t2.storeuid ";
joinQuery = joinQuery + "LEFT JOIN t3 ON t1.guid=t3.guid AND t1.storeuid=t3.storeuid ";
joinQuery = joinQuery + "LEFT JOIN goodslist ON t1.guid=goodslist.guid ";
joinQuery = joinQuery + "WHERE IFNULL(t3.amount,0)/t1.days-IFNULL(t2.amount,0) >0 ";
joinQuery = joinQuery + "ORDER BY IFNULL(t3.amount,0)/t1.days-IFNULL(t2.amount,0)";

try {
rs = stmt.executeQuery(joinQuery);
} catch(SQLException ex) {
System.out.println("on JOIN SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());

} 
Database db = agentContext.getCurrentDatabase();
Document doc = db.createDocument();
doc.appendItemValue("Form", "ProductReport");
Vector vguid = new Vector();
Vector vgoodname = new Vector();
Vector vstoreuid = new Vector();
Vector vonstore = new Vector();
Vector vtobuy = new Vector();
while (rs.next()) {
// retrieve and print the values for the current row
Integer guid = new Integer(rs.getInt("guid"));
Integer storeuid = new Integer(rs.getInt("storeuid"));
Integer onstore = new Integer(rs.getInt("onstore"));
Float tobuy = new Float(rs.getFloat("ness"));
vguid.addElement(guid);
vgoodname.addElement(rs.getString("goodname"));
vstoreuid.addElement(storeuid);		
vonstore.addElement(onstore);	
vtobuy.addElement(tobuy);
}
doc.appendItemValue("guid",vguid);
doc.appendItemValue("goodname",vgoodname);
doc.appendItemValue("storeuid", vstoreuid);
doc.appendItemValue("onstore", vonstore);
doc.appendItemValue("tobuy", vtobuy);
doc.save();
} finally {
if (rs != null) {
try {
rs.close();
} catch(SQLException ex) {} 
rs = null;
} //if
if (stmt != null) {
try {
stmt.close();
} catch(SQLException ex) {} 
stmt = null;
} //if
} //finally


} catch(Exception e) {
e.printStackTrace();
}
}
}
в яве не силен - за качество кода сильно не пинайте...
 
02.04.2005
170
1
#2
Вместо множества try {} catch () лучше использовать один блок для всего кода. И я бы еще очень посоветовал в блоке finally для всех нотесовских объектов делать recycle(). Домино не очень хорошо следит за использованием памяти:)
 
D

dopler123

#3
Возможно кому-то поможет.
На Линуксовом сервере с лотусом, sql коннектор завелся после того как положил коннектор.jar в lib/ext.
Прописывание пути к конектору в Classpath не помогает.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Коннектор к mysql</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'>import java.sql.*;

void initbase() {
odbcName = "cfg_odbcname";
odbcUserName = "cfg_odbcusername";
odbcPassword = "cfg_odbcpassword";

try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn = DriverManager.getConnection("jdbc:eek:dbc:" + odbcName, odbcUserName, odbcPassword);
}
catch (Exception e) {
e.printStackTrace();
}
}[/CODE]
 

susinmn

Well-known member
16.10.2007
529
3
#4
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">тоже код)</div></div><div class="sp-body"><div class="sp-content">
Код:
import lotus.domino.*;
import java.sql.*;

public class JavaAgent extends AgentBase {
static Connection con;
static Statement stmt;
static ResultSet rs;

public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://ip_server:server_port/dbname", "user", "пароль");
Statement stmt = con.createStatement();
ResultSet rs=stmt.executeQuery("select * from test"); //в Sybase хранимку дергаю, так же как и select exec название проц. параметры через запятую
//ResultSet rs=stmt.executeQuery("exec prc_find_client '21160', '036-810/09ю', 252");
while (rs.next()) {
long s = rs.getLong(1); //здесь задаешь тип 1 колонки
long n = rs.getLong(2); //здесь задаешь тип 2 колонки

System.out.println(s + "  " + n);
}
//close all resources
stmt.close();
con.close();
} catch(Exception e) {
e.printStackTrace();
System.out.println("что-то не получилось(");
}
}
}
 

RixPvl

Well-known member
30.11.2011
85
0
#5
Привет всем еще раз, в общем ситуация следующая:
Я написал класс на JAVA по работе с MySQL, и провел тестирование на платформе windows и linux, результат был следующим:
на винде все прошло 100% успешно и проблем ни каких не возникло, а вот на линухе проблема появилась с кодировкой как ее можно решить? вместо русских символов "?"

делал вот так, не помогло
SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'
 

lmike

нет, пердело совершенство
Премиум
27.08.2008
6 567
263
#6
всю схему взаимодействия опишите:
-где стоит мускуль (платформа)
-где стоит скрипт выбора из БД
-где сам код
 

RixPvl

Well-known member
30.11.2011
85
0
#7
Сервера MySQL и Lotus и все скрипты стоят на Linux


<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Класс MySQL на JAVA</div></div><div class="sp-body"><div class="sp-content">
Код:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

class jMySQL {
private String name = "MySQL [JAVA]";
private Statement stmt = null;
private ResultSet rs = null;
private Connection conn = null;
private boolean DriverLoaded = false;
private boolean Connected = false;
private boolean SQL_EXEC = false;

private void Print(String Text){
System.out.println(name + ": " + Text);
}

public boolean InstallCharSet(String CharSetName)
{
try
{
if (!Connected)
{
Print("[InstallCharSet]: Не выполнено подключение!");
return false;
}
String SQL_CHAR = "SET character_set_results = '"+CharSetName+"', character_set_client = '"+CharSetName+"', character_set_connection = '"+CharSetName+"', character_set_database = '"+CharSetName+"', character_set_server = '"+CharSetName+"'";
stmt = conn.createStatement();
stmt.executeUpdate(SQL_CHAR);
return false;
} catch (Exception e) {
Print("[InstallCharSet]: " + e.getMessage());
return false;
}
}

public void GetMySQLInfo()
{
try
{
String SQLS = "SHOW VARIABLES";
stmt = conn.createStatement();
stmt.execute(SQLS);
rs = stmt.getResultSet();
} catch (Exception e) {
Print("-[GetMySQLInfo]---------------------------------------------");
e.printStackTrace();
}

}

public String real_escape_string(String SQLTEXT)
{
if (SQLTEXT.isEmpty())
{
return "";
}

if (SQLTEXT.replaceAll("[a-zA-Z0-9_!@#$%^&*()-=+~.;:,\\Q[\\E\\Q]\\E<>{}\\/? ]","").length() < 1) 
{
return SQLTEXT;
}

String clean_string = SQLTEXT;
clean_string = clean_string.replaceAll("\\\\", "\\\\\\\\");
clean_string = clean_string.replaceAll("\\n","\\\\n");
clean_string = clean_string.replaceAll("\\r", "\\\\r");
clean_string = clean_string.replaceAll("\\t", "\\\\t");
clean_string = clean_string.replaceAll("\\00", "\\\\0");
clean_string = clean_string.replaceAll("'", "\\\\'");
clean_string = clean_string.replaceAll("\\\"", "\\\\\"");

return clean_string;
}

private boolean LoadDriver(){
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
DriverLoaded = true;
}
catch (Exception ex)
{
DriverLoaded = false;
}
return DriverLoaded;
}

public boolean Connect(String Host, String DataBase, String Login, String Password) {
if (Host.trim() == "" || DataBase.trim() == "" || Login.trim() == "" || Password.trim() == "")
{
Print("[Connect] Проверьте все ли параметры указаны!");
return false;
}
if (DriverLoaded != true){
Print("[Connect] Драйвер не загружен!");
Connected = false;
return false;
}
try {
conn = DriverManager.getConnection("jdbc:mysql://"+Host+"/"+DataBase+"?user="+Login+"&password="+Password);
Connected = true;
return true;
} 
catch (SQLException ex)
{
Print("[Connect]: " + ex.getMessage() + " " + ex.getErrorCode());
Connected = false;
return false;
}
}

public boolean GetConnection(){

return Connected;
}

public boolean SQLExec(String Query){
if (!Connected)
{
Print("[SQLExec]: Не выполнено подключение!");
return false;
}
SQL_EXEC = false;
try {
stmt = conn.createStatement();
if (stmt.execute(Query)) {
rs = stmt.getResultSet();
SQL_EXEC = true;
return true;
} else
{
SQL_EXEC = false;
return false;
}
} catch (Exception ex) {
SQL_EXEC = false;
Print("[SQLExec]: " + ex.getMessage());
return false;
}
}

public boolean Disconnect(){
try
{
rs.close();
return true;
} catch (Exception ex) {
Print("[Disconnect]: " + ex.getMessage());
return false;
}
}

public ResultSet Result() {
if (!SQL_EXEC) {
return null;
} else
{
return rs;
}
}

public jMySQL() {
try
{
LoadDriver();
} 
catch (Exception ex) 
{
Print("[jMySQL]: " + ex.getMessage());
}
}

}

ну и часть кода выгрузки данных из Lotus'а в MySQL
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">ExportDep</div></div><div class="sp-body"><div class="sp-content">
Код:
	private void ExportDep(Database db) {
Document doc;
View view;
try {
Print("[OK] - Составление списка управлений из модуля Шлюз...!");
/* Фиксируем время начало выполнения агента */
view = db.getView("depByName");
Print("[OK] - Найдено документов: " + view.getEntryCount());
if (view.getEntryCount() == 0) 
{
Print("[W] - Не найдено ни одного управления, завершение выполнение агента!");
return;	
}
/* Очищаем таблицу от старых записей, для загрузки более актуальной информации */
Print("[OK] - Очистка таблицы MySQL...!");
SQL = "TRUNCATE TABLE `dep_list`";
SQLEXECR = MySQL.SQLExec(SQL);
Print("[OK] - Очистка завершена!");
Print("[OK] - Начинаем выгрузку данных в MySQL...");
/* Перебираем документы и выполняем запрос на добавлении их в MySQL базу */
doc = view.getFirstDocument();

while (doc != null) {
/* Получение данных из текущего документа,а так же проверка некоторых обязательных полей */
String dep_id = doc.getItemValueString("fDUnid");
String dep_name = doc.getItemValueString("fDName");
String dep_namekz = doc.getItemValueString("fDNameKZ");

String dep_address = doc.getItemValueString("fDAddress");
String dep_leader = doc.getItemValueString("fDLeader");
String dep_leader_contact = doc.getItemValueString("fDLeader_ContactInfo");
String dep_leader_email = doc.getItemValueString("fDLeader_ContactEmail");
String dep_citizen = doc.getItemValueString("fDCitizen_FIO");
String dep_citizen_contact = doc.getItemValueString("fDCitizen_ContactInfo");
String dep_sort_id = doc.getItemValueString("fDSortID").trim();

dep_sort_id = dep_sort_id.isEmpty()?"300":dep_sort_id;


/* Экранизация данных - предотвращает ошибки при отправки SQL запросов */
dep_name = MySQL.real_escape_string(dep_name);
dep_namekz = MySQL.real_escape_string(dep_namekz);
dep_address = MySQL.real_escape_string(dep_address);
dep_leader_contact = MySQL.real_escape_string(dep_leader_contact);
dep_leader_email = MySQL.real_escape_string(dep_leader_email);
dep_citizen_contact = MySQL.real_escape_string(dep_citizen_contact);


/* Подготовка SQL Запроса */
SQL = "INSERT INTO `dep_list` " +
"(`dep_id`,`dep_name`,`dep_namekz`,`dep_address`,`" +
"dep_leader`,`dep_leader_contact`,`dep_leader_email`,`dep_citizen`," +
"`dep_citizen_contact`,`dep_sort_id`)";
SQL += "VALUES(";
SQL +=	"'"+dep_id+"','"+dep_name+"','"+dep_namekz+"','"+dep_address+"'," +
"'"+dep_leader+"','"+dep_leader_contact+"','"+dep_leader_email+"','"+dep_citizen+"'," +
"'"+dep_citizen_contact+"', '"+dep_sort_id+"')";

/* Отправка запроса */
SQLEXECR = MySQL.SQLExec(SQL);
/* Получаем следующий документ */
doc = view.getNextDocument(doc);
}
MySQL.SQLExec(SQL);
Print("[OK] - Запись в таблицу обновлений внесена!");
Print("[OK] - Выполнение синхронизации завершено!");
Print("------------------------------------------------------------------");
} catch (Exception e) {
Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
e.printStackTrace();
}
}
 

RixPvl

Well-known member
30.11.2011
85
0
#8
Ситуация следующая:
Имеется Lotus сервер и MySQL сервер на Linux, Lotus с интервалом 2 часа выполняет выгрузку данных в MySQL выполняет выгрузку 5000+ записей и начинает выбивать в консоль ошибку OutOfMemoryError:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Текст с консоли</div></div><div class="sp-body"><div class="sp-content">
06/22/2012 10:32:07 AM Agent Manager: Agent error: JVMDUMP006I Processing dump event "systhrow", detail "java/lang/OutOfMemoryError" - please wait.
06/22/2012 10:32:07 AM Agent Manager: Agent error: JVMDUMP032I JVM requested Snap dump using '/var/lib/notes/data/Snap.20120622.103207.1909.0001.trc' in response to an event
06/22/2012 10:32:07 AM Agent Manager: Agent error: JVMDUMP010I Snap dump written to /var/lib/notes/data/Snap.20120622.103207.1909.0001.trc
06/22/2012 10:32:07 AM Agent Manager: Agent error: JVMDUMP032I JVM requested Snap dump using '/var/lib/notes/data/Snap.20120622.103207.1909.0002.trc' in response to an event
06/22/2012 10:32:07 AM Agent Manager: Agent error: JVMDUMP010I Snap dump written to /var/lib/notes/data/Snap.20120622.103207.1909.0002.trc
06/22/2012 10:32:07 AM Agent Manager: Agent error: JVMDUMP032I JVM requested Heap dump using '/var/lib/notes/data/heapdump.20120622.103207.1909.0003.phd' in response to an event
06/22/2012 10:32:09 AM Agent Manager: Agent error: JVMDUMP010I Heap dump written to /var/lib/notes/data/heapdump.20120622.103207.1909.0003.phd
06/22/2012 10:32:09 AM Agent Manager: Agent error: JVMDUMP032I JVM requested Java dump using '/var/lib/notes/data/javacore.20120622.103207.1909.0005.txt' in response to an event
06/22/2012 10:32:09 AM Agent Manager: Agent error: JVMDUMP010I Java dump written to /var/lib/notes/data/javacore.20120622.103207.1909.0005.txt
06/22/2012 10:32:09 AM Agent Manager: Agent error: JVMDUMP013I Processed dump event "systhrow", detail "java/lang/OutOfMemoryError".
06/22/2012 10:32:09 AM Agent Manager: Agent error: JVMDUMP032I JVM requested Heap dump using '/var/lib/notes/data/heapdump.20120622.103207.1909.0004.phd' in response to an event
06/22/2012 10:32:11 AM Agent Manager: Agent error: JVMDUMP010I Heap dump written to /var/lib/notes/data/heapdump.20120622.103207.1909.0004.phd
06/22/2012 10:32:11 AM Agent Manager: Agent error: JVMDUMP032I JVM requested Java dump using '/var/lib/notes/data/javacore.20120622.103207.1909.0006.txt' in response to an event
06/22/2012 10:32:12 AM Agent Manager: Agent error: JVMDUMP010I Java dump written to /var/lib/notes/data/javacore.20120622.103207.1909.0006.txt
06/22/2012 10:32:12 AM Agent Manager: Agent error: JVMDUMP006I Processing dump event "systhrow", detail "java/lang/OutOfMemoryError" - please wait.
06/22/2012 10:32:12 AM Agent Manager: Agent error: JVMDUMP032I JVM requested Snap dump using '/var/lib/notes/data/Snap.20120622.103211.1909.0007.trc' in response to an event
06/22/2012 10:32:12 AM Agent Manager: Agent error: JVMDUMP010I Snap dump written to /var/lib/notes/data/Snap.20120622.103211.1909.0007.trc
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 802
21
#9
Хм... странновато...
Но по идее не должно быть.... может где-то в коде ошибка?
Про такие ошибки ТУТ что-то пишут
 
13.03.2009
625
1
#10
06/22/2012 10:32:09 AM Agent Manager: Agent error: JVMDUMP013I Processed dump event "systhrow", detail "java/lang/OutOfMemoryError".
...
06/22/2012 10:32:11 AM Agent Manager: Agent error: JVMDUMP010I Heap dump written to /var/lib/notes/data/heapdump.20120622.103207.1909.0004.phd
Память у JVM не резиновая, об она и сообщила... Причиной обычно является либо утечка памяти, либо попытка накидать на кучу данных, превышающих ее размер. Вы часом не пытаетесь все 5k записей пихать в какую-нить java collection?

Вариантов решения ровно два: увеличить JavaMaxHeapSize в notes.ini, либо исправлять код.

P.S. JVM при OutOfMemoryError сбрасывает dump кучи (тот самый .phd из крэш-лога), который можно посмотреть на предмет того, куда девалась память. Для этого есть например Eclipse Memory Analyzer ( aka MAT ) и плагин к нему для работы с дампами ibm.
 

RixPvl

Well-known member
30.11.2011
85
0
#11
Память у JVM не резиновая, об она и сообщила... Причиной обычно является либо утечка памяти, либо попытка накидать на кучу данных, превышающих ее размер. Вы часом не пытаетесь все 5k записей пихать в какую-нить java collection?

Вариантов решения ровно два: увеличить JavaMaxHeapSize в notes.ini, либо исправлять код.

P.S. JVM при OutOfMemoryError сбрасывает dump кучи (тот самый .phd из крэш-лога), который можно посмотреть на предмет того, куда девалась память. Для этого есть например Eclipse Memory Analyzer ( aka MAT ) и плагин к нему для работы с дампами ibm.
JavaMaxHeapSize не нашел, но есть HTTPJVMMaxHeapSize это одно и тоже или нет?

Насчет кода вот он:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Собственно сам класс по работе с MySQL</div></div><div class="sp-body"><div class="sp-content">
C++:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

class jMySQL {
private String name = "MySQL [JAVA]";
private Statement stmt = null;
private ResultSet rs = null;
private Connection conn = null;
private boolean DriverLoaded = false;
private boolean Connected = false;
private boolean SQL_EXEC = false;

private void Print(String Text){
System.out.println(name + ": " + Text);
}

public boolean InstallCharSet(String CharSetName)
{
try
{
if (!Connected)
{
Print("[InstallCharSet]: Не выполнено подключение!");
return false;
}
String SQL_CHAR = "SET character_set_results = '"+CharSetName+"', character_set_client = '"+CharSetName+"', character_set_connection = '"+CharSetName+"', character_set_database = '"+CharSetName+"', character_set_server = '"+CharSetName+"'";
stmt = conn.createStatement();
stmt.executeUpdate(SQL_CHAR);
return false;
} catch (Exception e) {
Print("[InstallCharSet]: " + e.getMessage());
return false;
}
}

public void GetMySQLInfo()
{
try
{
String SQLS = "SHOW VARIABLES";
stmt = conn.createStatement();
stmt.execute(SQLS);
rs = stmt.getResultSet();
SQL_EXEC = true;
} catch (Exception e) {
Print("-[GetMySQLInfo]---------------------------------------------");
e.printStackTrace();
}

}

public String real_escape_string(String SQLTEXT)
{
if (SQLTEXT.isEmpty())
{
return "";
}

if (SQLTEXT.replaceAll("[a-zA-Z0-9_!@#$%^&*()-=+~.;:,\\Q[\\E\\Q]\\E<>{}\\/? ]","").length() < 1) 
{
return SQLTEXT;
}

String clean_string = SQLTEXT;
clean_string = clean_string.replaceAll("\\\\", "\\\\\\\\");
clean_string = clean_string.replaceAll("\\n","\\\\n");
clean_string = clean_string.replaceAll("\\r", "\\\\r");
clean_string = clean_string.replaceAll("\\t", "\\\\t");
clean_string = clean_string.replaceAll("\\00", "\\\\0");
clean_string = clean_string.replaceAll("'", "\\\\'");
clean_string = clean_string.replaceAll("\\\"", "\\\\\"");

return clean_string;
}

private boolean LoadDriver(){
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
DriverLoaded = true;
}
catch (Exception ex)
{
DriverLoaded = false;
}
return DriverLoaded;
}

public boolean Connect(String Host, String DataBase, String Login, String Password) {
if (Host.trim() == "" || DataBase.trim() == "" || Login.trim() == "" || Password.trim() == "")
{
Print("[Connect] Проверьте все ли параметры указаны!");
return false;
}
if (DriverLoaded != true){
Print("[Connect] Драйвер не загружен!");
Connected = false;
return false;
}
try {
conn = DriverManager.getConnection("jdbc:mysql://"+Host+"/"+DataBase+"?user="+Login+"&password="+Password);
Connected = true;
return true;
} 
catch (SQLException ex)
{
Print("[Connect]: " + ex.getMessage() + " " + ex.getErrorCode());
Connected = false;
return false;
}
}

public boolean GetConnection(){

return Connected;
}

public boolean SQLExec(String Query){
if (!Connected)
{
Print("[SQLExec]: Не выполнено подключение!");
return false;
}
SQL_EXEC = false;
try {
stmt = conn.createStatement();
if (stmt.execute(Query)) {
rs = stmt.getResultSet();
SQL_EXEC = true;
return true;
} else
{
SQL_EXEC = false;
return false;
}
} catch (Exception ex) {
SQL_EXEC = false;
Print("[SQLExec]: " + ex.getMessage());
return false;
}
}

public boolean Disconnect(){
try
{
rs.close();
return true;
} catch (Exception ex) {
Print("[Disconnect]: " + ex.getMessage());
return false;
}
}

public ResultSet Result() {
if (!SQL_EXEC) {
return null;
} else
{
return rs;
}
}

public jMySQL() {
try
{
LoadDriver();
} 
catch (Exception ex) 
{
Print("[jMySQL]: " + ex.getMessage());
}
}

}
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">И агент</div></div><div class="sp-body"><div class="sp-content">
C++:
import lotus.domino.*;
import java.util.*;
import java.io.PrintWriter;
import java.text.*;

public class MySQLExport extends AgentBase {
jMySQL MySQL = new jMySQL();	
String AgentName = "Export2SQL";
String SQL = "";
int NCount = 0;

boolean SQLEXECR = false;

/* Получить текущую дату */
private String getDateTime(String format) {
format = format.isEmpty()?"dd.MM.yyyy hh:mm:ss":format;
DateFormat dateFormat = new SimpleDateFormat(format);
Date date = new Date();
return dateFormat.format(date);
}

/* метод для конверации даты в дату в формате UNIX */
private long StrToDateUnix(String datatime, String format)
{
try
{
format = format.isEmpty()?"dd.MM.yyyy hh:mm:ss":format;
DateFormat formatter = new SimpleDateFormat("dd.MM.yyyy hh:mm:ss"); 
Date date2 = formatter.parse(datatime);
return (long)date2.getTime() / 1000L;
} catch (Exception e) {
return -1;
}
}

/* Аналог функции Print в LS */
private void Print(String Text){
System.out.println(AgentName + ": " +Text);
}

private void ExportNotice(Database db) {
Document doc;
View view;
try {
Print("[OK] - Поиск уведомлений в модуле Шлюз...!");
view = db.getView("noticesByUniqueNum");
NCount = view.getEntryCount();
Print("[OK] - Найдено уведомлений: " + NCount);
if (NCount == 0) 
{
Print("[W] - Не найдено ни одного докумета, завершение выполнение агента!");
return;	
}
/* Очищаем таблицу от старых записей, для загрузки более актуальной информации */
Print("[OK] - Очистка таблицы уведомлений в MySQL...!");
SQL = "TRUNCATE TABLE `notice`";
SQLEXECR = MySQL.SQLExec(SQL);
Print("[OK] - Очистка завершена!");
Print("[OK] - Начинаем выгрузку уведомлений в MySQL...");
/* Перебираем документы и выполняем запрос на добавлении их в MySQL базу */
doc = view.getFirstDocument();

while (doc != null) {
/* Получение данных из текущего документа,а так же проверка некоторых обязательных полей */
String fnRegNum = doc.getItemValueString("fnRegNum");
String fnSendet = doc.getItemValueString("fnSendet");
long fnDataTime = StrToDateUnix( doc.getItemValueString("fnDataTime"), "");
String fnDepID = !doc.getItemValueString("fnDepID").isEmpty()?doc.getItemValueString("fnDepID").trim():"0";
String fnDepIDTo = !doc.getItemValueString("fnDepIDTo").isEmpty()?doc.getItemValueString("fnDepIDTo").trim():"0";
String fnOrganization = doc.getItemValueString("fnOrganization");
String fnAppName = doc.getItemValueString("fnAppName");
String fnAppEmail = doc.getItemValueString("fnAppEmail");
String fnAppMPhone = doc.getItemValueString("fnAppMPhone");
String fnCategory = !doc.getItemValueString("fnCategory").isEmpty()?doc.getItemValueString("fnCategory").trim():"0";
String fNStatIndex = !doc.getItemValueString("fNStatIndex").isEmpty()?doc.getItemValueString("fNStatIndex").trim():"0";
String fNStatText = doc.getItemValueString("fNStatText");
long fNStatExpire = StrToDateUnix( doc.getItemValueString("fNStatExpire") + " 00:00:00", "");
String fnExName = doc.getItemValueString("fnExName");
String fnExPost = doc.getItemValueString("fnExPost");
String fnUniqNum = doc.getItemValueString("fnUniqNum");
long fnCreateTime = StrToDateUnix( doc.getItemValueString("fnCreateTime"), "");

/* Экранизация данных - предотвращает ошибки при отправки SQL запросов */
fnRegNum = MySQL.real_escape_string(fnRegNum);
fnOrganization = MySQL.real_escape_string(fnOrganization);
fnAppName = MySQL.real_escape_string(fnAppName);
fnAppEmail = MySQL.real_escape_string(fnAppEmail);
fNStatText = MySQL.real_escape_string(fNStatText);
fnExPost = MySQL.real_escape_string(fnExPost);
fnExName = MySQL.real_escape_string(fnExName);
fnUniqNum = MySQL.real_escape_string(fnUniqNum);


/* Подготовка SQL Запроса */
SQL = "INSERT INTO `notice` " +
"(`fnRegNum`,`fnSendet`,`fnDataTime`,`" +
"fnDepID`,`fnDepIDTo`,`fnOrganization`,`fnAppName`," +
"`fnAppEmail`,`fnAppMPhone`,`fnCategory`,`fNStatIndex`," +
"`fNStatText`,`fNStatExpire`,`fnExName`,`fnExPost`,`fnUniqNum`, `fnCreateTime`)";
SQL += "VALUES(";
SQL +=	"'"+fnRegNum.trim()+"','"+fnSendet.trim()+"','"+fnDataTime+"'," +
"'"+fnDepID.trim()+"','"+fnDepIDTo.trim()+"','"+fnOrganization.trim()+"','"+fnAppName.trim()+"'," +
"'"+fnAppEmail.trim()+"','"+fnAppMPhone.trim()+"','"+fnCategory.trim()+"','"+fNStatIndex.trim()+"'," +
"'"+fNStatText.trim()+"','"+fNStatExpire+"','"+fnExName.trim()+"','"+fnExPost.trim()+"','"+fnUniqNum.trim()+"', '"+fnCreateTime+"')";

/* Отправка запроса */
/*Print(SQL); */
SQLEXECR = MySQL.SQLExec(SQL);
/* Получаем следующий документ */
doc = view.getNextDocument(doc);
}
Print("[OK] - Экспорт уведомлений завершен!");
Print("------------------------------------------------------------------");
} catch (Exception e) {
Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
e.printStackTrace();
}
}

private void ExportDep(Database db) {
Document doc;
View view;
try {
Print("[OK] - Составление списка управлений из модуля Шлюз...!");
view = db.getView("depByName");
Print("[OK] - Найдено документов: " + view.getEntryCount());
if (view.getEntryCount() == 0) 
{
Print("[W] - Не найдено ни одного управления, завершение выполнение агента!");
return;	
}
/* Очищаем таблицу от старых записей, для загрузки более актуальной информации */
Print("[OK] - Очистка таблицы MySQL...!");
SQL = "TRUNCATE TABLE `dep_list`";
SQLEXECR = MySQL.SQLExec(SQL);
Print("[OK] - Очистка завершена!");
Print("[OK] - Начинаем выгрузку данных в MySQL...");
/* Перебираем документы и выполняем запрос на добавлении их в MySQL базу */
doc = view.getFirstDocument();

while (doc != null) {
/* Получение данных из текущего документа,а так же проверка некоторых обязательных полей */
String dep_id = doc.getItemValueString("fDUnid");
String dep_name = doc.getItemValueString("fDName");
String dep_namekz = doc.getItemValueString("fDNameKZ");

String dep_address = doc.getItemValueString("fDAddress");
String dep_leader = doc.getItemValueString("fDLeader");
String dep_leader_contact = doc.getItemValueString("fDLeader_ContactInfo");
String dep_leader_email = doc.getItemValueString("fDLeader_ContactEmail");
String dep_citizen = doc.getItemValueString("fDCitizen_FIO");
String dep_citizen_contact = doc.getItemValueString("fDCitizen_ContactInfo");
int dep_sort_id = (int) doc.getItemValueInteger("fDSortID");

dep_sort_id = dep_sort_id <=0?300:dep_sort_id;


/* Экранизация данных - предотвращает ошибки при отправки SQL запросов */
dep_name = MySQL.real_escape_string(dep_name);
dep_namekz = MySQL.real_escape_string(dep_namekz);
dep_address = MySQL.real_escape_string(dep_address);
dep_leader_contact = MySQL.real_escape_string(dep_leader_contact);
dep_leader_email = MySQL.real_escape_string(dep_leader_email);
dep_citizen_contact = MySQL.real_escape_string(dep_citizen_contact);


/* Подготовка SQL Запроса */
SQL = "INSERT INTO `dep_list` " +
"(`dep_id`,`dep_name`,`dep_namekz`,`dep_address`,`" +
"dep_leader`,`dep_leader_contact`,`dep_leader_email`,`dep_citizen`," +
"`dep_citizen_contact`,`dep_sort_id`)";
SQL += "VALUES(";
SQL +=	"'"+dep_id+"','"+dep_name+"','"+dep_namekz+"','"+dep_address+"'," +
"'"+dep_leader+"','"+dep_leader_contact+"','"+dep_leader_email+"','"+dep_citizen+"'," +
"'"+dep_citizen_contact+"', '"+dep_sort_id+"')";

/* Отправка запроса */
SQLEXECR = MySQL.SQLExec(SQL);
/* Получаем следующий документ */
doc = view.getNextDocument(doc);
}
MySQL.SQLExec(SQL);
Print("[OK] - Запись в таблицу обновлений внесена!");
Print("[OK] - Экспорт списка управлений завершен!");
Print("------------------------------------------------------------------");
} catch (Exception e) {
Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
e.printStackTrace();
}
}

private void ExportStatus(Database db) {
Document doc;
View view;
try {
Print("[OK] - Составление списка статусов из модуля Шлюз...!");
view = db.getView("vInf_Status");
Print("[OK] - Найдено статусов: " + view.getEntryCount());
if (view.getEntryCount() == 0) 
{
Print("[W] - Не найдено ни одного статуса, завершение выполнение агента!");
return;	
}
/* Очищаем таблицу от старых записей, для загрузки более актуальной информации */
Print("[OK] - Очистка таблицы MySQL...!");
SQL = "TRUNCATE TABLE `status_list`";
SQLEXECR = MySQL.SQLExec(SQL);
Print("[OK] - Очистка завершена!");
Print("[OK] - Начинаем выгрузку данных в MySQL...");
/* Перебираем документы и выполняем запрос на добавлении их в MySQL базу */
doc = view.getFirstDocument();

while (doc != null) {
/* Получение данных из текущего документа,а так же проверка некоторых обязательных полей */
String status_id = doc.getItemValueString("fSUid");
String status_name = doc.getItemValueString("fSNameRU");
String status_namekz = doc.getItemValueString("fSNameKZ");


/* Подготовка SQL Запроса */
SQL = "INSERT INTO `status_list` " +
"(`status_id`,`status_name`,`status_namekz`)";
SQL += "VALUES(";
SQL +=	"'"+status_id+"','"+status_name+"','"+status_namekz+"')";

/* Отправка запроса */
SQLEXECR = MySQL.SQLExec(SQL);
/* Получаем следующий документ */
doc = view.getNextDocument(doc);
}
MySQL.SQLExec(SQL);
Print("[OK] - Экспорт статусов завершен!");
Print("------------------------------------------------------------------");
} catch (Exception e) {
Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
e.printStackTrace();
}
}
/* Основной инициируемый метод */
public void NotesMain() {
PrintWriter PW=getAgentOutput();
/* Фиксируем время начало выполнения агента */
long StartTime = System.currentTimeMillis() / 1000;
Session session = getSession();
try {
/* Выполнение */
Print("[!] - Инициализция агенте синхронизации с MySQL сервером!" );

Database db = session.getAgentContext().getCurrentDatabase();
Print("[!] - Получение настроек агента!" );
Document profile = db.getProfileDocument("fProfile", "");

if (profile == null)
{
Print("[!] - Проверьте настройки в базе!" ); 
return;	
}

String Run = profile.getItemValueString("fPMysqlEnabled");
String Login = profile.getItemValueString("fPMysqlLogin");
String Password = profile.getItemValueString("fPMysqlPassword");
String DBName = profile.getItemValueString("fPMysqlDataBaseName");
String Host = profile.getItemValueString("fPMysqlHost");

if (Run.isEmpty())
{
Print("[!] - Агент отключен. Проверьте настройки в базе!" ); 
return;
}

boolean cnt = MySQL.Connect(Host, DBName, Login, Password);
if (!cnt)
{
Print("[ER] - Не удалось соедениться с сервером MySQL. Продробности об ошибке смотрете в логах сервера!");
return;	
}

Print("[OK] - Платформа: " + System.getProperty("os.name")); 
Print("[OK] - Соединение с MySQL сервером прошло успешно!");

/* Экспорт статусов */
ExportStatus(db);
/* Экспорт списка управлений */
ExportDep(db);
/* Экспорт формы уведомлений */
ExportNotice(db);

/* UNIX время завершения выполнения агента */
long EndTime = System.currentTimeMillis() / 1000;


long CurrentDate = StrToDateUnix(getDateTime("dd.MM.yyyy") + " 00:00:00", "");

SQL = "INSERT INTO `notice_update` (`date_update`, `last_update`, `start_update`, `recordcount`) VALUES ('"+CurrentDate+"', '"+StartTime+"','"+EndTime+"','"+NCount+"')";
MySQL.SQLExec(SQL);	

SQL = "INSERT INTO notice_logupdate (`day_id`,`start_time`, `end_time`, `recordcount`) VALUES ('"+CurrentDate+"', '"+StartTime+"', '"+EndTime+"', '"+NCount+"') " +
"ON DUPLICATE KEY UPDATE start_time='"+StartTime+"', end_time='"+EndTime+"', recordcount='"+NCount+"'";

MySQL.SQLExec(SQL);
Print("[OK] - Синхронизация успешно завершена");
PW.println("Content-type: text/plain; charser: utf-8");
PW.println("OK");

} catch (Exception e) {
Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
e.printStackTrace();
}
}
}
Добавлено:
Вариантов решения ровно два: увеличить JavaMaxHeapSize в notes.ini, либо исправлять код.
а какой размер по умолчанию?
 

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#12
Вроде цикл правильный...

Попробовать бы сделать recycle()..

И вообще из 3-х методов Export_ выделил бы общую часть - общий метод, куда и цикл бы вынес. И вконце метода добавил бы
<!--shcode--><pre><code class='java'>finally {
doc.recycle();
view.recycle();
}[/CODE]Если будет падать, то наверное надо с памятью играться. Больше идей у меня нет.

Добавлено:
И что-то бы придумал, чтобы SQL-запрос автоматом формировался, а не такой ужас... Например готовить HashMap("имя поля в Лотус") = "имя поля в mySql" или 2 Vector'а (векторы из Лотуса легче получить) и вбрасывать в метод. Так понятнее было бы.
 

Кирилл Шваб

Well-known member
30.06.2006
145
4
#13
RixPvl,
Привет всем!
Ситуация следующая:
Имеется Lotus Сервер и MySQL сервер, Lotus с интервалом 2 часа выполняет выгрузку данных в MySQL выполняет выгрузку 5000+ записей и начинает писать в консоль:
Открой дамп и посмотри кто съел всю память с помощью IBM Heap Analyzer или как советует turumbay с помощью Eclipse Memory Analyzer.
IBM Heap Analyzer просто меньше по размеру - всего 5 Мб.
JavaMaxHeapSize не нашел, но есть HTTPJVMMaxHeapSize это одно и тоже или нет?
Нет.

JavaMaxHeapSize - максимальный размер памяти, которую может использовать JVM (виртуальная машина Java) задачи Agent Manager, отвечающей в том числе за запуск агентов в контексте клиента (т.е. запускаемые при работе в клиенте или на сервере).

HTTPJVMMaxHeapSize - максимальный размер памяти, которую может использовать JVM задачи HTTP, отвечающей в том числе за запуск агентов в контексте веба (т.е. запускаемые при работе в веб)
а какой размер по умолчанию?
Для JavaMaxHeapSize в 8.5 по умолчанию идет 64 Мб. Подробности в лотусовой вики: http://www-10.lotus.com/ldd/dominowiki.nsf...133PMHPERN7.htm

P.S.
По поводу собирания SQL запроса в строку и передачи ее в функцию - лучше используй
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">PreparedStatement</div></div><div class="sp-body"><div class="sp-content">Для начала на русском:
http://www.javaportal.ru/java/tutorial/tut...dstatement.html

Затем "от создателя":
http://docs.oracle.com/javase/tutorial/jdb...s/prepared.html

И затем примеры на Java:
http://www.roseindia.net/jdbc/jdbc-mysql/SelectRecords.shtml
http://www.roseindia.net/jdbc/jdbc-mysql/T...Statement.shtml
 

RixPvl

Well-known member
30.11.2011
85
0
#14
Кирилл Шваб, lmike большое Вам спасибо, завтра попробую сделать все что вы написали.
Жаль еще раз нельзя плюсануть)
 

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#15
RixPvl
Было бы интересно увидеть, как преобразился код в результате этих проб)
 

RixPvl

Well-known member
30.11.2011
85
0
#16
Как раз сейчас делаю используя новый метод, только вот столкнулся с одним моментом как сделать ее в виде "универсальной" функции что то типа

Код:
function bool function SQL_EXEC(String SQL, params) 
{
...
}
объясню суть функции, а точнее покажу

SQL_EXEC("INSERT INTO table(f1,f2,f3) VALUES(?,?,?)", p1, p2, p3)
причем кол-во параметром может быть разным
 

RixPvl

Well-known member
30.11.2011
85
0
#17
Есть правда следующая идея написать функции что то типа

Код:
	 public PreparedStatement SetPreparedStatementSQLExec_Use(String Query) {
try {
return (PreparedStatement) conn.prepareStatement(Query);
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
а потом написать функцию которая будет присваивать значения типа
Код:
setLong(1, 123456789);
и функция выполнения запроса, только получается муторно кажется)
 

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#18
RixPvl
Я выше что-то такое имел ввиду:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'>/**
* @param nd - документ, из которого будут вычисляться значения
* @param vctRdbFields - вектор полей реляционной БД, полученный из конфугурационного документа
* @param vctLdbFormulas - вектор формул для вычисления значений из документа, передаваемых в соответствующее поле РДБ вектора vctRdbFields,
* полученный из конфугурационного документа; чаще всего просто имя item'а
* @param vctValueTypes - вектор типов передаваемых значений, полученный из конфугурационного документа
* Количество значений в векторах должно быть равным (контролируется в интерфейсе конфигурационного документа и/или методе инициализации векторов).
* @return Запрос в виде строки, сгенерированный по переданному документу
*/
public String generateDocumentRequest(Document nd, Vector vctRdbFields, Vector vctLdbFormulas, Vector vctValueTypes) {
String sRequest;
for (int i = 0; i < vctRdbFields.size(); i++) {
// здесь производим вычисление значений и сборку текста запроса
// вполне возможно использовать здесь PreparedStatement, но тогда, наверное, функция будет возвращать уже не String
// для того, чтобы использовать vctValueTypes для вызова setXXX, наверное логично заюзать Reflection
}
return sRequest;
}[/CODE]Кстати, вектора можно не передавать параметрами, а сделать их полями класса, т.к. метод будет вызываться в цикле, то меняться будет только сам документ.

Добавлено:
Про Java Reflection можно почитать здесь, а можно просто проставить switch и не заморачиваться. Но с Reflection красивше :)
 

RixPvl

Well-known member
30.11.2011
85
0
#19
Думаю к PreparedStatement я вернусь, смотрю на это все и думаю что надо хорошенько посидеть чтобы понять что к чему, и на сколько это быстрей чем то что я использую?

сейчас я увеличил JavaMaxHeapSize до 256 мб и до скольки можно ее поднять? это зависит от озу?

+ сделал изменение при переборе клекции по аналогии из хелп лотуса
<!--shcode--><pre><code class='java'>while (doc != null) {
System.out.println
("\t" + doc.getItemValueString("Subject"));
tmpdoc = view.getNextDocument(doc);
doc.recycle();
doc = tmpdoc;
}[/CODE]
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Чуть измененный агент</div></div><div class="sp-body"><div class="sp-content">
Код:
import lotus.domino.*;
import java.util.*;
import java.io.PrintWriter;
import java.text.*;

public class MySQLExport extends AgentBase {
jMySQL MySQL = new jMySQL();	
String AgentName = "Export2SQL";
String SQL = "";
int NCount = 0;
Database db = null;
Document profile = null;
PrintWriter PW = null;

boolean SQLEXECR = false;

/* Получить текущую дату */
private String getDateTime(String format) {
format = format.isEmpty()?"dd.MM.yyyy hh:mm:ss":format;
DateFormat dateFormat = new SimpleDateFormat(format);
Date date = new Date();
return dateFormat.format(date);
}

/* метод для конверации даты в дату в формате UNIX */
private long StrToDateUnix(String datatime, String format)
{
try
{
format = format.isEmpty()?"dd.MM.yyyy hh:mm:ss":format;
DateFormat formatter = new SimpleDateFormat("dd.MM.yyyy hh:mm:ss"); 
Date date2 = formatter.parse(datatime);
return (long)date2.getTime() / 1000L;
} catch (Exception e) {
return -1;
}
}

/* Аналог функции Print в LS */
private void Print(String Text){
System.out.println(AgentName + ": " +Text);
}

private void ExportNotice(Database db) {
Document doc = null;
View view = null;
Document ntTmp = null;

try {
try {
Print("[OK] - Поиск уведомлений в модуле Шлюз...!");
view = db.getView("noticesByUniqueNum");
NCount = view.getEntryCount();
Print("[OK] - Найдено уведомлений: " + NCount);
if (NCount == 0) 
{
Print("[W] - Не найдено ни одного докумета, завершение выполнение агента!");
return;	
}
/* Очищаем таблицу от старых записей, для загрузки более актуальной информации */
Print("[OK] - Очистка таблицы уведомлений в MySQL...!");
SQL = "TRUNCATE TABLE `notice`";
SQLEXECR = MySQL.SQLExec(SQL);
Print("[OK] - Очистка завершена!");
Print("[OK] - Начинаем выгрузку уведомлений в MySQL...");
/* Перебираем документы и выполняем запрос на добавлении их в MySQL базу */
doc = view.getFirstDocument();

while (doc != null) {
/* Получение данных из текущего документа,а так же проверка некоторых обязательных полей */
String fnRegNum = doc.getItemValueString("fnRegNum");
String fnSendet = doc.getItemValueString("fnSendet");
long fnDataTime = StrToDateUnix( doc.getItemValueString("fnDataTime"), "");
String fnDepID = !doc.getItemValueString("fnDepID").isEmpty()?doc.getItemValueString("fnDepID").trim():"0";
String fnDepIDTo = !doc.getItemValueString("fnDepIDTo").isEmpty()?doc.getItemValueString("fnDepIDTo").trim():"0";
String fnOrganization = doc.getItemValueString("fnOrganization");
String fnAppName = doc.getItemValueString("fnAppName");
String fnAppEmail = doc.getItemValueString("fnAppEmail");
String fnAppMPhone = doc.getItemValueString("fnAppMPhone");
String fnCategory = !doc.getItemValueString("fnCategory").isEmpty()?doc.getItemValueString("fnCategory").trim():"0";
String fNStatIndex = !doc.getItemValueString("fNStatIndex").isEmpty()?doc.getItemValueString("fNStatIndex").trim():"0";
String fNStatText = doc.getItemValueString("fNStatText");
long fNStatExpire = StrToDateUnix( doc.getItemValueString("fNStatExpire") + " 00:00:00", "");
String fnExName = doc.getItemValueString("fnExName");
String fnExPost = doc.getItemValueString("fnExPost");
String fnUniqNum = doc.getItemValueString("fnUniqNum");
long fnCreateTime = StrToDateUnix( doc.getItemValueString("fnCreateTime"), "");

/* Экранизация данных - предотвращает ошибки при отправки SQL запросов */
fnRegNum = MySQL.real_escape_string(fnRegNum);
fnOrganization = MySQL.real_escape_string(fnOrganization);
fnAppName = MySQL.real_escape_string(fnAppName);
fnAppEmail = MySQL.real_escape_string(fnAppEmail);
fNStatText = MySQL.real_escape_string(fNStatText);
fnExPost = MySQL.real_escape_string(fnExPost);
fnExName = MySQL.real_escape_string(fnExName);
fnUniqNum = MySQL.real_escape_string(fnUniqNum);


/* Подготовка SQL Запроса */
SQL = "INSERT INTO `notice` " +
"(`fnRegNum`,`fnSendet`,`fnDataTime`,`" +
"fnDepID`,`fnDepIDTo`,`fnOrganization`,`fnAppName`," +
"`fnAppEmail`,`fnAppMPhone`,`fnCategory`,`fNStatIndex`," +
"`fNStatText`,`fNStatExpire`,`fnExName`,`fnExPost`,`fnUniqNum`, `fnCreateTime`)";
SQL += "VALUES(";
SQL +=	"'"+fnRegNum.trim()+"','"+fnSendet.trim()+"','"+fnDataTime+"'," +
"'"+fnDepID.trim()+"','"+fnDepIDTo.trim()+"','"+fnOrganization.trim()+"','"+fnAppName.trim()+"'," +
"'"+fnAppEmail.trim()+"','"+fnAppMPhone.trim()+"','"+fnCategory.trim()+"','"+fNStatIndex.trim()+"'," +
"'"+fNStatText.trim()+"','"+fNStatExpire+"','"+fnExName.trim()+"','"+fnExPost.trim()+"','"+fnUniqNum.trim()+"', '"+fnCreateTime+"')";

/* Отправка запроса */
/*Print(SQL); */
SQLEXECR = MySQL.SQLExec(SQL);
/* Получаем следующий документ */

ntTmp = doc;
doc = null;
doc = view.getNextDocument(ntTmp);
ntTmp.recycle();
}
Print("[OK] - Экспорт уведомлений завершен!");
Print("------------------------------------------------------------------");
} catch (Exception e) {
Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
e.printStackTrace();
}
} finally {
doc = null;
view = null;
ntTmp = null;
}

}

private void ExportDep(Database db) {
Document doc = null;
View view = null;
Document ntTmp = null;

try {
try {
Print("[OK] - Составление списка управлений из модуля Шлюз...!");
view = db.getView("depByName");
Print("[OK] - Найдено документов: " + view.getEntryCount());
if (view.getEntryCount() == 0) 
{
Print("[W] - Не найдено ни одного управления, завершение выполнение агента!");
return;	
}
/* Очищаем таблицу от старых записей, для загрузки более актуальной информации */
Print("[OK] - Очистка таблицы MySQL...!");
SQL = "TRUNCATE TABLE `dep_list`";
SQLEXECR = MySQL.SQLExec(SQL);
Print("[OK] - Очистка завершена!");
Print("[OK] - Начинаем выгрузку данных в MySQL...");
/* Перебираем документы и выполняем запрос на добавлении их в MySQL базу */
doc = view.getFirstDocument();

while (doc != null) {
/* Получение данных из текущего документа,а так же проверка некоторых обязательных полей */
String dep_id = doc.getItemValueString("fDUnid");
String dep_name = doc.getItemValueString("fDName");
String dep_namekz = doc.getItemValueString("fDNameKZ");

String dep_address = doc.getItemValueString("fDAddress");
String dep_leader = doc.getItemValueString("fDLeader");
String dep_leader_contact = doc.getItemValueString("fDLeader_ContactInfo");
String dep_leader_email = doc.getItemValueString("fDLeader_ContactEmail");
String dep_citizen = doc.getItemValueString("fDCitizen_FIO");
String dep_citizen_contact = doc.getItemValueString("fDCitizen_ContactInfo");
int dep_sort_id = (int) doc.getItemValueInteger("fDSortID");

dep_sort_id = dep_sort_id <=0?300:dep_sort_id;


/* Экранизация данных - предотвращает ошибки при отправки SQL запросов */
dep_name = MySQL.real_escape_string(dep_name);
dep_namekz = MySQL.real_escape_string(dep_namekz);
dep_address = MySQL.real_escape_string(dep_address);
dep_leader_contact = MySQL.real_escape_string(dep_leader_contact);
dep_leader_email = MySQL.real_escape_string(dep_leader_email);
dep_citizen_contact = MySQL.real_escape_string(dep_citizen_contact);


/* Подготовка SQL Запроса */
SQL = "INSERT INTO `dep_list` " +
"(`dep_id`,`dep_name`,`dep_namekz`,`dep_address`,`" +
"dep_leader`,`dep_leader_contact`,`dep_leader_email`,`dep_citizen`," +
"`dep_citizen_contact`,`dep_sort_id`)";
SQL += "VALUES(";
SQL +=	"'"+dep_id+"','"+dep_name+"','"+dep_namekz+"','"+dep_address+"'," +
"'"+dep_leader+"','"+dep_leader_contact+"','"+dep_leader_email+"','"+dep_citizen+"'," +
"'"+dep_citizen_contact+"', '"+dep_sort_id+"')";

/* Отправка запроса */
SQLEXECR = MySQL.SQLExec(SQL);
/* Получаем следующий документ */

ntTmp = doc;
doc = null;
doc = view.getNextDocument(ntTmp);
ntTmp.recycle();
}

MySQL.SQLExec(SQL);
Print("[OK] - Запись в таблицу обновлений внесена!");
Print("[OK] - Экспорт списка управлений завершен!");
Print("------------------------------------------------------------------");
} catch (Exception e) {
Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
e.printStackTrace();
}
} finally {
doc = null;
view = null;
ntTmp = null;
}

}

private void ExportStatus(Database db) {
Document doc = null;
View view = null;
Document ntTmp = null;

try {
try {
Print("[OK] - Составление списка статусов из модуля Шлюз...!");
view = db.getView("vInf_Status");
Print("[OK] - Найдено статусов: " + view.getEntryCount());
if (view.getEntryCount() == 0) 
{
Print("[W] - Не найдено ни одного статуса, завершение выполнение агента!");
return;	
}
/* Очищаем таблицу от старых записей, для загрузки более актуальной информации */
Print("[OK] - Очистка таблицы MySQL...!");
SQL = "TRUNCATE TABLE `status_list`";
SQLEXECR = MySQL.SQLExec(SQL);
Print("[OK] - Очистка завершена!");
Print("[OK] - Начинаем выгрузку данных в MySQL...");
/* Перебираем документы и выполняем запрос на добавлении их в MySQL базу */
doc = view.getFirstDocument();

while (doc != null) {
/* Получение данных из текущего документа,а так же проверка некоторых обязательных полей */
String status_id = doc.getItemValueString("fSUid");
String status_name = doc.getItemValueString("fSNameRU");
String status_namekz = doc.getItemValueString("fSNameKZ");


/* Подготовка SQL Запроса */
SQL = "INSERT INTO `status_list` " +
"(`status_id`,`status_name`,`status_namekz`)";
SQL += "VALUES(";
SQL +=	"'"+status_id+"','"+status_name+"','"+status_namekz+"')";

/* Отправка запроса */
SQLEXECR = MySQL.SQLExec(SQL);
/* Получаем следующий документ */
ntTmp = doc;
doc = null;
doc = view.getNextDocument(ntTmp);
ntTmp.recycle();
}


MySQL.SQLExec(SQL);
Print("[OK] - Экспорт статусов завершен!");
Print("------------------------------------------------------------------");
} catch (Exception e) {
Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
e.printStackTrace();
}
} finally {
doc = null;
view = null;
ntTmp = null;
}


}
/* Основной инициируемый метод */
public void NotesMain() {
PW=getAgentOutput();
/* Фиксируем время начало выполнения агента */
long StartTime = System.currentTimeMillis() / 1000;
Session session = getSession();

try{

try {
/* Выполнение */
Print("[!] - Инициализция агента синхронизации с MySQL сервером!" );

db = session.getAgentContext().getCurrentDatabase();
Print("[!] - Получение настроек агента!" );
profile = db.getProfileDocument("fProfile", "");

if (profile == null)
{
Print("[!] - Проверьте настройки в базе!" ); 
return;	
}

String Run = profile.getItemValueString("fPMysqlEnabled");
String Login = profile.getItemValueString("fPMysqlLogin");
String Password = profile.getItemValueString("fPMysqlPassword");
String DBName = profile.getItemValueString("fPMysqlDataBaseName");
String Host = profile.getItemValueString("fPMysqlHost");

if (Run.isEmpty())
{
Print("[!] - Агент отключен. Проверьте настройки в базе!" ); 
return;
}

boolean cnt = MySQL.Connect(Host, DBName, Login, Password);
if (!cnt)
{
Print("[ER] - Не удалось соедениться с сервером MySQL. Продробности об ошибке смотрете в логах сервера!");
return;	
}

Print("[OK] - Платформа: " + System.getProperty("os.name")); 
Print("[OK] - Соединение с MySQL сервером прошло успешно!");

/* Экспорт статусов */
ExportStatus(db);
/* Экспорт списка управлений */
ExportDep(db);
/* Экспорт формы уведомлений */
ExportNotice(db);

/* UNIX время завершения выполнения агента */
long EndTime = System.currentTimeMillis() / 1000;


long CurrentDate = StrToDateUnix(getDateTime("dd.MM.yyyy") + " 00:00:00", "");

SQL = "INSERT INTO `notice_update` (`date_update`, `last_update`, `start_update`, `recordcount`) VALUES ('"+CurrentDate+"', '"+StartTime+"','"+EndTime+"','"+NCount+"')";
MySQL.SQLExec(SQL);	

SQL = "INSERT INTO notice_logupdate (`day_id`,`start_time`, `end_time`, `recordcount`) VALUES ('"+CurrentDate+"', '"+StartTime+"', '"+EndTime+"', '"+NCount+"') " +
"ON DUPLICATE KEY UPDATE start_time='"+StartTime+"', end_time='"+EndTime+"', recordcount='"+NCount+"'";

MySQL.SQLExec(SQL);
Print("[OK] - Синхронизация успешно завершена");
PW.println("Content-type: text/plain; charser: utf-8");
PW.println("OK");
} catch (Exception e) {
Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
e.printStackTrace();
}

}
finally {
PW = null;	
MySQL = null;		
profile = null;
db = null;
}



}
}
вроде как заработало и выполнился агент до конца, но тут заметил одну вещь возможно ошибаюсь, то все же

сегодня днем проверял состояние памяти на сервере было 50-60% занято, к концу дня занято было 96%, с чем это может быть связано? не нужно ли после выполнения всех агентов выполнять уничтожение всех созданных объектов?
 

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#20