мое решение:
static string GetPolyndrom(string str)
{
string Longest = "";
for (int i = 0; i < str.Length; i++)
{
if ((str.Length - 1 - i) < Longest.Length)
{
break;
}
for (int j = str.Length - 1; j > i; j--)
{
string str2 = str.Substring(i, j - i + 1);
if (str2.Length > Longest.Length)
{
if (str2 == str2.Reverse())
{
Longest = str2;
}
}
else
{
break;
}
}
}
return Longest;
}
я задаюсь вопросом, является ли это хорошей практикой?
номер. Это не хорошо. Иногда, это - все, что Вы имеете, но это не хорошо.
И, каков мог быть более эффективный способ реализовать это?
, Как вещи входят в базу данных во-первых?
лучшее изменение состоит в том, чтобы исправить программы, которые вставляют/обновляют базу данных для выполнения запросов, которые переходят к базе данных и к программе. Тема JMS хороша для такого рода вещи.
следующее лучшее изменение состоит в том, чтобы добавить триггер к базе данных для постановки в очередь, каждый вставляет/обновляет событие в очередь. Очередь могла подать тему JMS (или очередь) для обработки Вашей программой.
план нейтрализации является Вашим циклом опроса.
Ваш цикл опроса, однако, не должен тривиально делать работы. Это должно бросить сообщение в очередь для некоторого другого процесса JDBC, чтобы продолжить работать. Запрос завершения является другим сообщением, которое может быть брошено в очередь JMS. Когда Ваша программа получает сообщение завершения, она абсолютно должна быть закончена с предшествующим запросом JDBC и может остановиться корректно.
Прежде, чем сделать любое из этого, посмотрите на решения ESB. Sun JCAPS или TIBCO уже имеет это. ESB с открытым исходным кодом как Mulesource или Jitterbit можно было уже создать эту функциональность уже и протестированный.
Это - действительно слишком большая проблема для ответа полностью в этом формате. Сделайте себе одолжение и пойдите, покупают Параллелизм Java на практике . Нет никакого лучшего ресурса для параллелизма на Java 5 + платформа там. Существуют целые главы посвящены этому предмету.
На предмет уничтожения Вашего процесса во время вызова JDBC, который должен быть прекрасным. Я полагаю, что существуют проблемы с прерыванием вызова JDBC (в котором Вы не можете?), но это - другой вопрос.
String.hashCode()
четко определено и стабильное, подразумевают, что порядок записей в хэш-таблице последователен?
– Konrad Garus
31 May 2011 в 18:50
Поскольку другие сказали, то, что необходимо опросить, вероятно, показательно из более глубокой проблемы с дизайном системы..., но иногда это - путь, которым это идет, таким образом...
, Если требуется обработать "уничтожение" процесса немного более корректно, Вы могли бы установить рычаг завершения работы, который называют, когда Вы поражаете Ctrl + C :
volatile boolean stop = false;
Runtime.getRuntime().addShutdownHook(new Thread("shutdown thread") {
public void run() {
stop = true;
}
});
затем периодически проверяют переменную остановки.
А более изящное решение состоит в том, чтобы ожидать на событии:
boolean stop = false;
final Object event = new Object();
Runtime.getRuntime().addShutdownHook(new Thread("shutdown thread") {
public void run() {
synchronized(event) {
stop = true;
event.notifyAll();
}
}
});
// ... and in your polling loop ...
synchronized(event) {
while(!stop) {
// ... do JDBC access ...
try {
// Wait 30 seconds, but break out as soon as the event is fired.
event.wait(30000);
}
catch(InterruptedException e) {
// Log a message and exit. Never ignore interrupted exception.
break;
}
}
}
Или что-то как этот.
Обратите внимание, что Таймер (или подобный) был бы лучше в этом, Вы могли, по крайней мере, снова использовать его и позволить ему сделать со всеми деталями сна, планирования, обработки исключений, и т.д.
существует много причин, Ваше приложение могло умереть. Не фокусируйтесь на просто том.
, Если для Вашей работы JDBC даже теоретически возможно оставить вещи в полукорректном состоянии, затем у Вас есть ошибка, которую необходимо исправить. Вся Ваша работа DB должна быть в транзакции. Это должно пойти или не пойти.
Это - Java. Переместите свою обработку во второй поток. Теперь Вы можете
должны быть сотни вариантов на этом.
Относительно вопроса "Программа могла быть посреди вызова JDBC. Как я мог пойти о завершении его более корректно?" - видят , Как я могу прервать выполнение jdbc транзакция?
Примечание, что использование опроса со сном () редко является правильным решением - реализованный неправильно, это может закончиться hogging ресурсы ЦП (планировщик потока JVM заканчивает тем, что тратил беспорядочный сон количества времени и пробуждение поток).
Вы могли сделать поле составным значением, которое включает (концептуально) идентификатор процесса и метку времени. [Еще лучше используйте два или больше поля.] Запускают поток в процессе, который владеет доступом к полю, и имейте его цикл, спя и обновляя метку времени. Затем процесс опроса, который ожидает для владения доступом к полю, может заметить, что метка времени не обновила в некоторое время T (который намного больше, чем время интервала сна цикла обновления), и предположите, что ранее владеющий процесс умер.
, Но это все еще подвержено отказу.
На других языках, я всегда пытаюсь использовать скопление (), звонит для синхронизации на файле. Не уверенный, каков эквивалентный Java. Получите реальный параллелизм, если Вы вообще возможно можете.
Настройте обработчик сигналов для SIGTERM, который устанавливает флаг, говоря Вашему циклу выйти в его следующий раз через.
Если это - Ваше приложение, и можно изменить его, Вы можете:
Не должен работать он это тяжелее это это.
IвЂve создал Класс обслуживания в моей текущей company’s служебной библиотеке для этих видов проблем:
public class Service implements Runnable {
private boolean shouldStop = false;
public synchronized stop() {
shouldStop = true;
notify();
}
private synchronized shouldStop() {
return shouldStop;
}
public void run() {
setUp();
while (!shouldStop()) {
doStuff();
sleep(60 * 1000);
}
}
private synchronized sleep(long delay) {
try {
wait(delay);
} catch (InterruptedException ie1) {
/* ignore. */
}
}
}
, Конечно, это совсем не завершено, но необходимо получить суть. Это позволит Вам просто звонить stop()
метод, когда Вы захотите, чтобы программа остановилась, и это выйдет чисто.
Я удивлен, что никто не упомянул механизм прерываний, реализованный в Java. Предполагается, что это решение проблемы остановки потока. У всех других решений есть по крайней мере один недостаток, поэтому этот механизм необходим для реализации в библиотеке параллелизма Java.
Вы можете остановить поток, отправив ему сообщение interrupt (), но есть другие способы прерывания потоков , Когда это происходит, создается InterruptedException. Вот почему вы должны обрабатывать это, например, при вызове sleep (). Вот где вы можете выполнить очистку и завершить корректно, как закрытие соединения с базой данных.