Поскольку этот поток немного разветвился в общем обсуждении текущих реализаций с плавающей запятой, я бы добавил, что есть проекты по исправлению их проблем.
Взгляните на https: // posithub.org/, который демонстрирует тип номера, называемый posit (и его предшественник unum), который обещает предложить лучшую точность с меньшим количеством бит. Если мое понимание верное, оно также фиксирует проблемы в вопросе. Весьма интересный проект, человек, стоящий за ним, является математиком Dr. Джон Густафсон . Все это с открытым исходным кодом, с множеством реализаций в C / C ++, Python, Julia и C # ( https://hastlayer.com/arithmetics ).
Обычная практика состоит в том, чтобы сконфигурировать это как DataSource
в контейнере сервлетов . Он предоставит вам средства объединения пулов, которые значительно улучшат производительность. Также обычной практикой является экстернализация исходных настроек в каком-либо файле конфигурации, который был помещен в путь к классам.
Если вы используете Tomcat в качестве servletcontainer, вам необходимо настроить источник данных в соответствии с его документацией JNDI . Вы увидите, что есть несколько способов. Самый простой способ - создать /META-INF/context.xml
в webcontent вашего динамического веб-проекта (ясно, что /META-INF
находится на том же уровне, что и /WEB-INF
webapp) и заполнить его чем-то вроде:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/db" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
url="jdbc:mysql://hostname.com/db"
driverClassName="com.mysql.jdbc.Driver"
username="user" password="pass"
/>
</Context>
Это примерно означает, что сервер Tomcat должен создать источник данных с именем JNDI jdbc/db
с максимум 100 активными соединениями, максимум 30 простоями соединений и максимальным временем ожидания 10000 миллисекунд до того, как соединение должно (фактически: закрыто вашим приложением, поэтому ваше приложение имеет 10 секунд времени между приобретением соединения и закрытием соединения). Остальные настройки должны быть знакомы и достаточно объяснять вам; это настройки JDBC.
Наконец, в вашем веб-проекте отредактируйте файл /WEB-INF/web.xml
, чтобы добавить следующую запись:
<resource-env-ref>
<resource-env-ref-name>jdbc/db</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>
Это примерно означает, что веб-приложение должно использовать предоставленный сервером источник данных с помощью имя jdbc/db
.
Затем измените свой диспетчер подключений на что-то вроде этого:
private DataSource dataSource;
public Database(String jndiname) {
try {
dataSource = (DataSource) new InitialContext().lookup("java:comp/env/" + jndiname);
} catch (NamingException e) {
// Handle error that it's not configured in JNDI.
throw new IllegalStateException(jndiname + " is missing in JNDI!", e);
}
}
public Connection getConnection() {
return dataSource.getConnection();
}
.. и замените все Class.forName(driver)
вызовы на new Database("jdbc/db")
и замените все DriverManager.getConnection()
вызывает database.getConnection()
. Вы можете при необходимости получить значение jdbc/db
из некоторого файла конфигурации ( Файл свойств? ).
В качестве альтернативы введите DataSource
через @Resource
внутри управляемого контейнером артефакта, такого как класс сервлетов @WebServlet
:
@Resource("jdbc/db")
private DataSource dataSource;
Это должно быть так. Просто разверните веб-приложение с указанными выше изменениями и запустите его. Не забудьте поместить драйвер JDBC базы данных в Tomcat/lib
или добавить свой путь к свойству shared.loader
в Tomcat/conf/catalina.properties
, поскольку ответственность за загрузку драйвера JDBC теперь переносится из веб-приложения на сервер. Для получения дополнительных советов и других основных примеров JDBC / JNDI вы можете найти эту статью .
Вы можете настроить источник данных на любом сервере приложений, на котором развертывается WAR, и получить ссылку на него с помощью JNDI. Или вы можете упаковать свою WAR в EAR и определить источник данных в файле data-sources.xml EAR (и получить ссылку на него с помощью JNDI).