Когда организовывал доступ к базе из Интернет, решил тупо проверить, а сколько коннектов удержит моя система? Есть ли предел? Насколько мне было известно - количество подключений через WWW-шлюз не лимитируется даже на "Демо". В результате нашёл много интересного. Ты можешь повторить сам - это абсолютно безопасно даже на рабочей системе. Просто в этот момент никто не должен выполнять реальную работу, иначе получишь по полной.
Итак, запускаем браузеры. Но перед этим остановим Z-сервер и удалим EServer.log (именно .log, а не .exe!!!) - будет легче искать записи об ошибках. Стартуем Z-сервер и запускаем браузеры, сколько сможем. Проще всего это сделать из командной строки.
Стрелка вверх повторит предыдущую команду. По ходу можно закрывать уже открытые браузеры - они своё дело уже сделали. Периодически смотрим в EManager количество подключений. На "Демо" установке каждый новый браузер даёт два подключения, с другими настройками всё может быть по-другому, но смысл не изменит. Последний нормальный запуск происходит с достижением кол-ва подключений 62.
А дальше...
Подключение остаётся одно и появляется следующая ошибка:
18:42:28-15/05: [fatal][debug][warn][log][app][all] DB: User Connection: TSqlConnection.Open( Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\DB\Lib.mdb;Persist Security Info=False ): Неопознанная ошибка []
18:42:28-15/05: [fatal][debug][warn][log][app][all] Restart server []
А что произошло бы с обычными клиентами ("Абонемент", "Каталогизатор", ...)? Ты уже догадался - естественно они будут "сброшены". Если сомневаешься - проверь. У меня была очередь с жалобами на то, что система всё время требует ввести пароль, и я грешил на ошибки с таймаутом. А на самом деле всё оказалось проще. Что, при этом, происходит с базой - приходится только догадываться.
Хотя, судя по тексту ошибки, это не похоже на проблему с Z-сервером. Возможно это беда "Access" движка "Jet"? Как это проверить? Да запросто. Следующий скрипт просто создаёт подключения в кол-ве указанном в переменной count, выбрасывает исключение при ошибке и выводит кол-во успешных:
<HTML>
<HEAD>
<TITLE>ConnectCount</TITLE>
<HTA:APPLICATION ID="oHTA"
APPLICATIONNAME="myApp"
BORDER = "thick"
BORDERSTYLE="normal"
CAPTION="yes"
ICON=""
MAXIMIZEBUTTON="yes"
MINIMIZEBUTTON="yes"
SCROLL = "yes"
SHOWINTASKBAR="yes"
SINGLEINSTANCE="no"
SYSMENU="yes"
VERSION="1.0"
WINDOWSTATE="maximize"/>
<SCRIPT>
function getPath()
{
var pathl = document.URL;
var i = pathl.length;
var j;
while(pathl.charAt(--i) != '\\');
j = i;
while(pathl.charAt(--j) != '/');
return pathl.substring(j+1, i+1);
}
var i = 0;
conns = [];
count = 100;
while(i < count)
{
conns[i] = new ActiveXObject("ADODB.Connection");
conns[i].ConnectionString = "Provider='Microsoft.Jet.OLEDB.4.0';Data Source='" + getPath() + "adb.mdb'";
try
{
conns[i].Open();
i++;
}
catch(e)
{
alert(e.message);
break;
}
}
function window.onload()
{
oPre.innerText = i;
}
</SCRIPT>
</HEAD>
<BODY>
<PRE ID=oPre> </PRE>
</BODY>
</HTML>
Для начала сделаем count=100. Если захочешь повторить просто скопируй его в "Блокнот" и сохрани с любым именем и расширением .hta (например, ConnectionCount.hta). База adb.mdb любая (я сделал "Access"-ом пустую). Можешь скопировать Explain.mdb в тоже место, где находится скрипт и переименовать в adb.mdb. Запускаем и получаем:
та же ошибка, а количество подключений:
Сделаем count=64 - ошибки нет. Более того, её не будет, если тут же запустить второй экземпляр скрипта! В сумме окажется 128 подключений! Судя по всему это ограничение на процесс и новому процессу даётся новая "квота". Известно, что Z-сервер (EServer) "АС-Библиотека-3" работает одним многопоточным процессом и, по всей видимости, упирается в это ограничение. Поиски в Интернете и настройках "Jet" как обойти, или изменить порог в 64 ничего не дали (если у тебя есть какая либо информация на эту тему сообщи в комменте).
Какой выход? Я нашёл только один - переход на SQL Server. Но не торопись делать то же самое. Если у тебя несколько клиентов (не фиксируется вышеприведённая ошибка), небольшая база (меньше 1Гб в сжатом виде) и нет внешнего доступа, то издержки эксплуатации SQL Server перекроют все прелести неограниченой подключаемости. К тому же на небольшой базе Access обставит SQL и по скорости и по компактности.
Итак, запускаем браузеры. Но перед этим остановим Z-сервер и удалим EServer.log (именно .log, а не .exe!!!) - будет легче искать записи об ошибках. Стартуем Z-сервер и запускаем браузеры, сколько сможем. Проще всего это сделать из командной строки.
Стрелка вверх повторит предыдущую команду. По ходу можно закрывать уже открытые браузеры - они своё дело уже сделали. Периодически смотрим в EManager количество подключений. На "Демо" установке каждый новый браузер даёт два подключения, с другими настройками всё может быть по-другому, но смысл не изменит. Последний нормальный запуск происходит с достижением кол-ва подключений 62.
А дальше...
Подключение остаётся одно и появляется следующая ошибка:
18:42:28-15/05: [fatal][debug][warn][log][app][all] DB: User Connection: TSqlConnection.Open( Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\DB\Lib.mdb;Persist Security Info=False ): Неопознанная ошибка []
18:42:28-15/05: [fatal][debug][warn][log][app][all] Restart server []
А что произошло бы с обычными клиентами ("Абонемент", "Каталогизатор", ...)? Ты уже догадался - естественно они будут "сброшены". Если сомневаешься - проверь. У меня была очередь с жалобами на то, что система всё время требует ввести пароль, и я грешил на ошибки с таймаутом. А на самом деле всё оказалось проще. Что, при этом, происходит с базой - приходится только догадываться.
Хотя, судя по тексту ошибки, это не похоже на проблему с Z-сервером. Возможно это беда "Access" движка "Jet"? Как это проверить? Да запросто. Следующий скрипт просто создаёт подключения в кол-ве указанном в переменной count, выбрасывает исключение при ошибке и выводит кол-во успешных:
<HTML>
<HEAD>
<TITLE>ConnectCount</TITLE>
<HTA:APPLICATION ID="oHTA"
APPLICATIONNAME="myApp"
BORDER = "thick"
BORDERSTYLE="normal"
CAPTION="yes"
ICON=""
MAXIMIZEBUTTON="yes"
MINIMIZEBUTTON="yes"
SCROLL = "yes"
SHOWINTASKBAR="yes"
SINGLEINSTANCE="no"
SYSMENU="yes"
VERSION="1.0"
WINDOWSTATE="maximize"/>
<SCRIPT>
function getPath()
{
var pathl = document.URL;
var i = pathl.length;
var j;
while(pathl.charAt(--i) != '\\');
j = i;
while(pathl.charAt(--j) != '/');
return pathl.substring(j+1, i+1);
}
var i = 0;
conns = [];
count = 100;
while(i < count)
{
conns[i] = new ActiveXObject("ADODB.Connection");
conns[i].ConnectionString = "Provider='Microsoft.Jet.OLEDB.4.0';Data Source='" + getPath() + "adb.mdb'";
try
{
conns[i].Open();
i++;
}
catch(e)
{
alert(e.message);
break;
}
}
function window.onload()
{
oPre.innerText = i;
}
</SCRIPT>
</HEAD>
<BODY>
<PRE ID=oPre> </PRE>
</BODY>
</HTML>
Для начала сделаем count=100. Если захочешь повторить просто скопируй его в "Блокнот" и сохрани с любым именем и расширением .hta (например, ConnectionCount.hta). База adb.mdb любая (я сделал "Access"-ом пустую). Можешь скопировать Explain.mdb в тоже место, где находится скрипт и переименовать в adb.mdb. Запускаем и получаем:
та же ошибка, а количество подключений:
Сделаем count=64 - ошибки нет. Более того, её не будет, если тут же запустить второй экземпляр скрипта! В сумме окажется 128 подключений! Судя по всему это ограничение на процесс и новому процессу даётся новая "квота". Известно, что Z-сервер (EServer) "АС-Библиотека-3" работает одним многопоточным процессом и, по всей видимости, упирается в это ограничение. Поиски в Интернете и настройках "Jet" как обойти, или изменить порог в 64 ничего не дали (если у тебя есть какая либо информация на эту тему сообщи в комменте).
Какой выход? Я нашёл только один - переход на SQL Server. Но не торопись делать то же самое. Если у тебя несколько клиентов (не фиксируется вышеприведённая ошибка), небольшая база (меньше 1Гб в сжатом виде) и нет внешнего доступа, то издержки эксплуатации SQL Server перекроют все прелести неограниченой подключаемости. К тому же на небольшой базе Access обставит SQL и по скорости и по компактности.