WIP CachedRedisSqlTimeseriesLatestDao.java
This commit is contained in:
		
							parent
							
								
									3a86913e24
								
							
						
					
					
						commit
						9466578c91
					
				@ -489,6 +489,10 @@ cache:
 | 
			
		||||
  attributes:
 | 
			
		||||
    # make sure that if cache.type is 'redis' and cache.attributes.enabled is 'true' if you change 'maxmemory-policy' Redis config property to 'allkeys-lru', 'allkeys-lfu' or 'allkeys-random'
 | 
			
		||||
    enabled: "${CACHE_ATTRIBUTES_ENABLED:true}"
 | 
			
		||||
  ts_latest:
 | 
			
		||||
    # Will enable cache-aside strategy for SQL timeseries latest DAO.
 | 
			
		||||
    # make sure that if cache.type is 'redis' and cache.ts_latest.enabled is 'true' if you change 'maxmemory-policy' Redis config property to 'allkeys-lru', 'allkeys-lfu' or 'allkeys-random'
 | 
			
		||||
    enabled: "${CACHE_TS_LATEST_ENABLED:true}"
 | 
			
		||||
  specs:
 | 
			
		||||
    relations:
 | 
			
		||||
      timeToLiveInMinutes: "${CACHE_SPECS_RELATIONS_TTL:1440}" # Relations cache TTL
 | 
			
		||||
@ -539,6 +543,9 @@ cache:
 | 
			
		||||
    attributes:
 | 
			
		||||
      timeToLiveInMinutes: "${CACHE_SPECS_ATTRIBUTES_TTL:1440}" # Attributes cache TTL
 | 
			
		||||
      maxSize: "${CACHE_SPECS_ATTRIBUTES_MAX_SIZE:100000}" # 0 means the cache is disabled
 | 
			
		||||
    tsLatest:
 | 
			
		||||
      timeToLiveInMinutes: "${CACHE_SPECS_TS_LATEST_TTL:1440}" # Timeseries latest cache TTL
 | 
			
		||||
      maxSize: "${CACHE_SPECS_TS_LATEST_MAX_SIZE:100000}" # 0 means the cache is disabled
 | 
			
		||||
    userSessionsInvalidation:
 | 
			
		||||
      # The value of this TTL is ignored and replaced by the JWT refresh token expiration time
 | 
			
		||||
      timeToLiveInMinutes: "0"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										57
									
								
								build.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										57
									
								
								build.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,57 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
#
 | 
			
		||||
# Copyright © 2016-2024 The Thingsboard Authors
 | 
			
		||||
#
 | 
			
		||||
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
# you may not use this file except in compliance with the License.
 | 
			
		||||
# You may obtain a copy of the License at
 | 
			
		||||
#
 | 
			
		||||
#     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
#
 | 
			
		||||
# Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
# See the License for the specific language governing permissions and
 | 
			
		||||
# limitations under the License.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
set -e # exit on any error
 | 
			
		||||
 | 
			
		||||
#PROJECTS="msa/tb-node,msa/web-ui,rule-engine-pe/rule-node-twilio-sms"
 | 
			
		||||
PROJECTS=""
 | 
			
		||||
 | 
			
		||||
if [ "$1" ]; then
 | 
			
		||||
  PROJECTS="--projects $1"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo "Building and pushing [amd64,arm64] projects '$PROJECTS' ..."
 | 
			
		||||
echo "HELP: usage ./build.sh [projects]"
 | 
			
		||||
echo "HELP: example ./build.sh msa/web-ui,msa/web-report"
 | 
			
		||||
java -version
 | 
			
		||||
#echo "Cleaning ui-ngx/node_modules" && rm -rf ui-ngx/node_modules
 | 
			
		||||
 | 
			
		||||
MAVEN_OPTS="-Xmx1024m" NODE_OPTIONS="--max_old_space_size=4096" DOCKER_CLI_EXPERIMENTAL=enabled DOCKER_BUILDKIT=0 \
 | 
			
		||||
mvn -T2 license:format clean install -DskipTests \
 | 
			
		||||
  $PROJECTS --also-make
 | 
			
		||||
#   \
 | 
			
		||||
#  -Dpush-docker-amd-arm-images
 | 
			
		||||
#  -Ddockerfile.skip=false -Dpush-docker-image=true
 | 
			
		||||
#  --offline
 | 
			
		||||
#  --projects '!msa/web-report' --also-make
 | 
			
		||||
 | 
			
		||||
# push all
 | 
			
		||||
# mvn -T 1C license:format clean install -DskipTests -Ddockerfile.skip=false -Dpush-docker-image=true
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Build and push AMD and ARM docker images using docker buildx
 | 
			
		||||
## Reference to article how to setup docker miltiplatform build environment: https://medium.com/@artur.klauser/building-multi-architecture-docker-images-with-buildx-27d80f7e2408
 | 
			
		||||
## install docker-ce from docker repo https://docs.docker.com/engine/install/ubuntu/
 | 
			
		||||
# sudo apt install -y qemu-user-static binfmt-support
 | 
			
		||||
# export DOCKER_CLI_EXPERIMENTAL=enabled
 | 
			
		||||
# docker version
 | 
			
		||||
# docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
 | 
			
		||||
# docker buildx create --name mybuilder
 | 
			
		||||
# docker buildx use mybuilder
 | 
			
		||||
# docker buildx inspect --bootstrap
 | 
			
		||||
# docker buildx ls
 | 
			
		||||
# mvn clean install -P push-docker-amd-arm-images
 | 
			
		||||
							
								
								
									
										35
									
								
								common/cache/src/main/java/org/thingsboard/server/cache/TbJavaRedisSerializer.java
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								common/cache/src/main/java/org/thingsboard/server/cache/TbJavaRedisSerializer.java
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,35 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright © 2016-2024 The Thingsboard Authors
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.cache;
 | 
			
		||||
 | 
			
		||||
import org.springframework.data.redis.serializer.RedisSerializer;
 | 
			
		||||
import org.springframework.data.redis.serializer.SerializationException;
 | 
			
		||||
 | 
			
		||||
public class TbJavaRedisSerializer<K, V> implements TbRedisSerializer<K, V> {
 | 
			
		||||
 | 
			
		||||
    final RedisSerializer<Object> serializer = RedisSerializer.java();
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public byte[] serialize(V value) throws SerializationException {
 | 
			
		||||
        return serializer.serialize(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public V deserialize(K key, byte[] bytes) throws SerializationException {
 | 
			
		||||
        return (V) serializer.deserialize(bytes);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,26 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright © 2016-2024 The Thingsboard Authors
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao.util;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
@ConditionalOnExpression("('${database.ts_latest.type}'=='sql' || '${database.ts_latest.type}'=='timescale') && '${cache.ts_latest.enabled:false}'=='true' && '${cache.type:caffeine}'=='redis' ")
 | 
			
		||||
public @interface SqlTsLatestAnyDaoCachedRedis {
 | 
			
		||||
}
 | 
			
		||||
@ -34,6 +34,7 @@ public class CacheConstants {
 | 
			
		||||
 | 
			
		||||
    public static final String ASSET_PROFILE_CACHE = "assetProfiles";
 | 
			
		||||
    public static final String ATTRIBUTES_CACHE = "attributes";
 | 
			
		||||
    public static final String TS_LATEST_CACHE = "tsLatest";
 | 
			
		||||
    public static final String USERS_SESSION_INVALIDATION_CACHE = "userSessionsInvalidation";
 | 
			
		||||
    public static final String OTA_PACKAGE_CACHE = "otaPackages";
 | 
			
		||||
    public static final String OTA_PACKAGE_DATA_CACHE = "otaPackagesData";
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,104 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright © 2016-2024 The Thingsboard Authors
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao.sqlts;
 | 
			
		||||
 | 
			
		||||
import com.google.common.util.concurrent.ListenableFuture;
 | 
			
		||||
import jakarta.annotation.PostConstruct;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.context.annotation.Primary;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import org.thingsboard.server.cache.TbTransactionalCache;
 | 
			
		||||
import org.thingsboard.server.common.data.id.DeviceProfileId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.EntityId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.kv.DeleteTsKvQuery;
 | 
			
		||||
import org.thingsboard.server.common.data.kv.TsKvEntry;
 | 
			
		||||
import org.thingsboard.server.common.data.kv.TsKvLatestRemovingResult;
 | 
			
		||||
import org.thingsboard.server.common.stats.DefaultCounter;
 | 
			
		||||
import org.thingsboard.server.common.stats.StatsFactory;
 | 
			
		||||
import org.thingsboard.server.dao.cache.CacheExecutorService;
 | 
			
		||||
import org.thingsboard.server.dao.timeseries.TimeseriesLatestDao;
 | 
			
		||||
import org.thingsboard.server.dao.timeseries.TsLatestCacheKey;
 | 
			
		||||
import org.thingsboard.server.dao.util.SqlTsLatestAnyDaoCachedRedis;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Component
 | 
			
		||||
@SqlTsLatestAnyDaoCachedRedis
 | 
			
		||||
@RequiredArgsConstructor
 | 
			
		||||
@Primary
 | 
			
		||||
public class CachedRedisSqlTimeseriesLatestDao extends BaseAbstractSqlTimeseriesDao implements TimeseriesLatestDao {
 | 
			
		||||
    public static final String STATS_NAME = "ts_latest.cache";
 | 
			
		||||
 | 
			
		||||
    DefaultCounter hitCounter;
 | 
			
		||||
    DefaultCounter missCounter;
 | 
			
		||||
 | 
			
		||||
    final CacheExecutorService cacheExecutorService;
 | 
			
		||||
    final SqlTimeseriesLatestDao sqlDao;
 | 
			
		||||
    final StatsFactory statsFactory;
 | 
			
		||||
    final TbTransactionalCache<TsLatestCacheKey, TsKvEntry> cache;
 | 
			
		||||
 | 
			
		||||
    @PostConstruct
 | 
			
		||||
    public void init() {
 | 
			
		||||
        log.info("Init Redis cache-aside SQL Timeseries Latest DAO");
 | 
			
		||||
        this.hitCounter = statsFactory.createDefaultCounter(STATS_NAME, "result", "hit");
 | 
			
		||||
        this.missCounter = statsFactory.createDefaultCounter(STATS_NAME, "result", "miss");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ListenableFuture<Void> saveLatest(TenantId tenantId, EntityId entityId, TsKvEntry tsKvEntry) {
 | 
			
		||||
        return sqlDao.saveLatest(tenantId, entityId, tsKvEntry);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ListenableFuture<TsKvLatestRemovingResult> removeLatest(TenantId tenantId, EntityId entityId, DeleteTsKvQuery query) {
 | 
			
		||||
        return sqlDao.removeLatest(tenantId, entityId, query);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ListenableFuture<Optional<TsKvEntry>> findLatestOpt(TenantId tenantId, EntityId entityId, String key) {
 | 
			
		||||
        return sqlDao.findLatestOpt(tenantId, entityId, key);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ListenableFuture<TsKvEntry> findLatest(TenantId tenantId, EntityId entityId, String key) {
 | 
			
		||||
        return sqlDao.findLatest(tenantId, entityId, key);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public TsKvEntry findLatestSync(TenantId tenantId, EntityId entityId, String key) {
 | 
			
		||||
        return sqlDao.findLatestSync(tenantId, entityId, key);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ListenableFuture<List<TsKvEntry>> findAllLatest(TenantId tenantId, EntityId entityId) {
 | 
			
		||||
        return sqlDao.findAllLatest(tenantId, entityId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<String> findAllKeysByDeviceProfileId(TenantId tenantId, DeviceProfileId deviceProfileId) {
 | 
			
		||||
        return sqlDao.findAllKeysByDeviceProfileId(tenantId, deviceProfileId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<String> findAllKeysByEntityIds(TenantId tenantId, List<EntityId> entityIds) {
 | 
			
		||||
        return sqlDao.findAllKeysByEntityIds(tenantId, entityIds);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,40 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright © 2016-2024 The Thingsboard Authors
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao.timeseries;
 | 
			
		||||
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.EqualsAndHashCode;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import org.thingsboard.server.common.data.AttributeScope;
 | 
			
		||||
import org.thingsboard.server.common.data.id.EntityId;
 | 
			
		||||
 | 
			
		||||
import java.io.Serial;
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
 | 
			
		||||
@EqualsAndHashCode
 | 
			
		||||
@Getter
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
public class TsLatestCacheKey implements Serializable {
 | 
			
		||||
    private static final long serialVersionUID = 2024369077925351881L;
 | 
			
		||||
 | 
			
		||||
    private final EntityId entityId;
 | 
			
		||||
    private final String key;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        return "{" + entityId + "}" + key;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,35 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright © 2016-2024 The Thingsboard Authors
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao.timeseries;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 | 
			
		||||
import org.springframework.data.redis.connection.RedisConnectionFactory;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.thingsboard.server.cache.CacheSpecsMap;
 | 
			
		||||
import org.thingsboard.server.cache.RedisTbTransactionalCache;
 | 
			
		||||
import org.thingsboard.server.cache.TBRedisCacheConfiguration;
 | 
			
		||||
import org.thingsboard.server.cache.TbJavaRedisSerializer;
 | 
			
		||||
import org.thingsboard.server.common.data.CacheConstants;
 | 
			
		||||
import org.thingsboard.server.common.data.kv.TsKvEntry;
 | 
			
		||||
 | 
			
		||||
@ConditionalOnProperty(prefix = "cache", value = "type", havingValue = "redis")
 | 
			
		||||
@Service("TsLatestCache")
 | 
			
		||||
public class TsLatestRedisCache extends RedisTbTransactionalCache<TsLatestCacheKey, TsKvEntry> {
 | 
			
		||||
 | 
			
		||||
    public TsLatestRedisCache(TBRedisCacheConfiguration configuration, CacheSpecsMap cacheSpecsMap, RedisConnectionFactory connectionFactory) {
 | 
			
		||||
        super(CacheConstants.TS_LATEST_CACHE, cacheSpecsMap, connectionFactory, configuration, new TbJavaRedisSerializer<>());    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -10,6 +10,7 @@ audit-log.sink.type=none
 | 
			
		||||
#cache.type=caffeine # will be injected redis by RedisContainer or will be default (caffeine)
 | 
			
		||||
cache.maximumPoolSize=16
 | 
			
		||||
cache.attributes.enabled=true
 | 
			
		||||
cache.ts_latest.enabled=true
 | 
			
		||||
 | 
			
		||||
cache.specs.relations.timeToLiveInMinutes=1440
 | 
			
		||||
cache.specs.relations.maxSize=100000
 | 
			
		||||
@ -53,6 +54,9 @@ cache.specs.assetProfiles.maxSize=100000
 | 
			
		||||
cache.specs.attributes.timeToLiveInMinutes=1440
 | 
			
		||||
cache.specs.attributes.maxSize=100000
 | 
			
		||||
 | 
			
		||||
cache.specs.tsLatest.timeToLiveInMinutes=1440
 | 
			
		||||
cache.specs.tsLatest.maxSize=100000
 | 
			
		||||
 | 
			
		||||
cache.specs.tokensOutdatageTime.timeToLiveInMinutes=1440
 | 
			
		||||
cache.specs.tokensOutdatageTime.maxSize=100000
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -9,6 +9,7 @@
 | 
			
		||||
 | 
			
		||||
    <logger name="org.thingsboard.server.dao" level="WARN"/>
 | 
			
		||||
    <logger name="org.testcontainers" level="INFO" />
 | 
			
		||||
    <logger name="org.thingsboard.server.dao.sqlts" level="INFO" />
 | 
			
		||||
 | 
			
		||||
    <!-- Log Hibernate SQL queries -->
 | 
			
		||||
    <!-- <logger name="org.hibernate.SQL" level="DEBUG"/> -->
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user