Форум программистов, компьютерный форум, киберфорум
HCL Notes: Программирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/139: Рейтинг темы: голосов - 139, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 615

Lotus и MySQL (jdbc)

19.04.2009, 20:42. Показов 26937. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вроде работающий агент:

<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">

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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();
}
}
}
в яве не силен - за качество кода сильно не пинайте...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.04.2009, 20:42
Ответы с готовыми решениями:

Lotus и Firebird (jdbc)
Уважаемые господа подскажите, кто сталкивался, как мне подключиться к Firebird-овской БД и использовать табличные данные как справочник. ...

Lotus и Oracle (jdbc)
Граждане, возникла такая задача: сравнить вид в Лотусе и таблицу в Оракле на одинаковость. Сверяю их по некоему ID который есть и там и...

Lotus и db2 (jdbc)
Привет! Есть база данных на лотусе. в нее в Package Explorer в папку WebContent\WEB-INF\Lib\ положил jar файл c jdbc коннектором...

19
0 / 0 / 0
Регистрация: 29.03.2005
Сообщений: 151
19.04.2009, 23:08
Вместо множества try {} catch () лучше использовать один блок для всего кода. И я бы еще очень посоветовал в блоке finally для всех нотесовских объектов делать recycle(). Домино не очень хорошо следит за использованием памяти
0
doptyr123
20.11.2009, 04:46
Возможно кому-то поможет.
На Линуксовом сервере с лотусом, 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.JdbcOdbcDri ver");
conn = DriverManager.getConnection("jdbc:odbc:" + odbcName, odbcUserName, odbcPassword);
}
catch (Exception e) {
e.printStackTrace();
}
}[/CODE]
0 / 0 / 0
Регистрация: 12.10.2007
Сообщений: 522
21.11.2009, 10:35
<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">

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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("что-то не получилось(");
}
}
}
0
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 69
06.02.2012, 16:12
Привет всем еще раз, в общем ситуация следующая:
Я написал класс на 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
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
06.02.2012, 18:51
всю схему взаимодействия опишите:
-где стоит мускуль (платформа)
-где стоит скрипт выбора из БД
-где сам код
0
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 69
07.02.2012, 08:47
Сервера 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">

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
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">

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
    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();
}
}
0
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 69
21.06.2012, 09:15
Ситуация следующая:
Имеется 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
0
0 / 0 / 0
Регистрация: 18.08.2008
Сообщений: 1,698
21.06.2012, 12:20
Хм... странновато...
Но по идее не должно быть.... может где-то в коде ошибка?
Про такие ошибки ТУТ что-то пишут
0
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 615
21.06.2012, 20:08
Цитата Сообщение от RixPvl
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.
0
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 69
30.07.2012, 14:30
Цитата Сообщение от turumbay
Память у 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").n ewInstance();
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="+P assword);
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").isEmp ty()?doc.getItemValueString("fnDepID").t rim():"0";
String fnDepIDTo = !doc.getItemValueString("fnDepIDTo").isE mpty()?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").is Empty()?doc.getItemValueString("fnCatego ry").trim():"0";
String fNStatIndex = !doc.getItemValueString("fNStatIndex").i sEmpty()?doc.getItemValueString("fNStatI ndex").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.t rim()+"," +
""+fnAppEmail.trim()+","+fnAppMPhone.tri m()+","+fnCategory.trim()+","+fNStatInde x.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_Contact Info");
String dep_leader_email = doc.getItemValueString("fDLeader_Contact Email");
String dep_citizen = doc.getItemValueString("fDCitizen_FIO");
String dep_citizen_contact = doc.getItemValueString("fDCitizen_Contac tInfo");
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_cont act);
dep_leader_email = MySQL.real_escape_string(dep_leader_emai l);
dep_citizen_contact = MySQL.real_escape_string(dep_citizen_con tact);


/* Подготовка SQL Запроса */
SQL = "INSERT INTO `dep_list` " +
"(`dep_id`,`dep_name`,`dep_namekz`,`dep_ address`,`" +
"dep_leader`,`dep_leader_contact`,`dep_l eader_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_name kz`)";
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().getCurrentData base();
Print("[!] - Получение настроек агента!" );
Document profile = db.getProfileDocument("fProfile", "");

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

String Run = profile.getItemValueString("fPMysqlEnabl ed");
String Login = profile.getItemValueString("fPMysqlLogin ");
String Password = profile.getItemValueString("fPMysqlPassw ord");
String DBName = profile.getItemValueString("fPMysqlDataB aseName");
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, либо исправлять код.
а какой размер по умолчанию?
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
30.07.2012, 16:05
Вроде цикл правильный...

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

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

Добавлено:
И что-то бы придумал, чтобы SQL-запрос автоматом формировался, а не такой ужас... Например готовить HashMap("имя поля в Лотус") = "имя поля в mySql" или 2 Vectorа (векторы из Лотуса легче получить) и вбрасывать в метод. Так понятнее было бы.
0
0 / 0 / 0
Регистрация: 26.06.2006
Сообщений: 143
31.07.2012, 15:03
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/... ords.shtml
http://www.roseindia.net/jdbc/jdbc-mysql/T...Statement.shtml
0
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 69
01.08.2012, 10:38
Кирилл Шваб, lmike большое Вам спасибо, завтра попробую сделать все что вы написали.
Жаль еще раз нельзя плюсануть)
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
01.08.2012, 12:17
RixPvl
Было бы интересно увидеть, как преобразился код в результате этих проб)
0
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 69
01.08.2012, 13:38
Как раз сейчас делаю используя новый метод, только вот столкнулся с одним моментом как сделать ее в виде "универсальной" функции что то типа


Code
1
2
3
4
function bool function SQL_EXEC(String SQL, params)
{
...
}
объясню суть функции, а точнее покажу

SQL_EXEC("INSERT INTO table(f1,f2,f3) VALUES(?,?,?)", p1, p2, p3)
причем кол-во параметром может быть разным
0
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 69
01.08.2012, 13:53
Есть правда следующая идея написать функции что то типа


Code
1
2
3
4
5
6
7
8
     public PreparedStatement SetPreparedStatementSQLExec_Use(String Query) {
try {
return (PreparedStatement) conn.prepareStatement(Query);
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
а потом написать функцию которая будет присваивать значения типа

Code
1
setLong(1, 123456789);
и функция выполнения запроса, только получается муторно кажется)
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
01.08.2012, 16:01
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 красивше
0
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 69
01.08.2012, 16:44
Думаю к 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">

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
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%, с чем это может быть связано? не нужно ли после выполнения всех агентов выполнять уничтожение всех созданных объектов?
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
01.08.2012, 17:35
Цитата Сообщение от RixPvl
и на сколько это быстрей чем то что я использую?
Ну быстрее-то оно вряд ли будет (линейный код почти всегда быстрее), но удобней будет точно.

Добавлено: дискуссия по правильной очистке объектов перенесена в .
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.08.2012, 17:35
Помогаю со студенческими работами здесь

Lotus и MS SQL (jdbc)
Итак, по рекомендациям в топике ниже решено подключиться к sql2005 через JDBC. Из-под LD 8.5.1 Вроде всё просто, качаем jdbc-драйвер,...

Lotus и MySQL (LCConnection)
Доброго времени суток. Столкнулся с одной проблемой - нужно написать интерфейс на LoNo который будет работать в данными в MySQL....

Lotus и MySQL (ODBC)
Привет всем знатокам Лотуса! Подскажите, как импортнуть данные в MySQL (on Linux) из Lotus (on NT)?

Jdbc Access For Ibm Lotus Domino
Кто то настраивал JDBC Access for IBM Lotus Domino с Опеннтфа http://www.openntf.org/internal/home.nsf/p...0Lotus%20Domino ...

Ошибка при отправке запроса MySQL через JDBC MySQL connector
При помощи Maven я вызываю зависимости Twilio и JDBC MySQL connector, и собираю .jar файл. У меня есть кнопка Update в моем GUI, когда я ее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru